【问题标题】:PL-SQL bind variables in TCLTCL 中的 PL-SQL 绑定变量
【发布时间】:2013-05-29 10:16:03
【问题描述】:

有人可以在下面的 TCL 源代码中解释一下吗:

set sql "SELECT PROD.KEY || ' {' || PARAMETERS || '}' \
         FROM PRV_PROD_MAPPING PROD \
         WHERE PROD.SERVICE_ID = :service_id \
         AND (PROD.KEY || ' ' || PROD.KEY_VAL) \
         IN (:keys) "

:service_id:keys 是什么意思。我可以通过简单的跟踪查看背后的值吗? 我怎样才能找到这些变量的定义位置?

提前致谢!

【问题讨论】:

  • 您所展示的只是将字符串分配给名为“sql”的变量。你的程序用那个字符串做什么?您使用什么机制与数据库交互?
  • 你是对的,但我想知道的是如何查看 (:keys) 背后的值。当我尝试调用 $keys 时,没有这样的变量!
  • 我应该将这些绑定变量理解为占位符吗?
  • 它们确实是占位符;它们如何填写取决于驱动程序。那些符合 TDBC 规范的将使用变量或提供的字典(如 Glenn 的回答所示)。

标签: plsql tcl trace bind-variables


【解决方案1】:

它不是 TCL,它是嵌入在 TCL 字符串中的 SQL 查询,特别是 binds a variable,然后将其分配给普通的 TCL 变量

正如 glenn 所指出的,TCL 的这个 sn-p 本身做的很少。大概是在你的程序中的某个地方,你实际上连接到一个数据库,并通过这个字符串和其他一些变量向它传递一个查询

【讨论】:

    【解决方案2】:

    如果您使用的是TDBC,您可能有

    # assume the connection has already occured and is named "db"
    set sql "SELECT ... WHERE a.b=:service_id IN (:keys)"
    set statement [db prepare $sql]
    
    # get the bind variables' values from the local context:
    set service_id 42
    set keys [join {key1 key2 key3} ,]
    set resultset [$statement execute]
    
    # or, without setting the "service_id" and "keys" variables, 
    # provide them as an argument to the execute subcommand
    unset service_id keys
    set resultset [$statement execute {service_id 24 keys "foo,bar,baz"}]
    

    【讨论】:

    • 我对tcl不是很熟悉,但我认为它使用了一些以ora*开头的tcl嵌入式oracle函数。
    【解决方案3】:

    正如其他人指出的那样,您只需将字符串*分配给变量。

    更准确地说,您将以下字符串分配给名为sql的变量

    SELECT PROD.KEY || ' {' || PARAMETERS || '}'  FROM PRV_PROD_MAPPING PROD  WHERE PROD.SERVICE_ID = :service_id  AND (PROD.KEY || ' ' || PROD.KEY_VAL)  IN (:keys) 
    

    :service_id:keys 的值是稍后传递的绑定值(可能在 oraplexec 语句中)。

    || 是 SQL 中的字符串连接。所以PROD.KEY || ' {' || PARAMETERS || '}' 可能是PRODKEY {PARAMETERS}

    *一切都是字符串

    【讨论】:

      【解决方案4】:

      我已经使用痕迹完成了:

      sys.DBMS_SYSTEM.SET_EV(n_sid, n_serial, 10046, 12, '');
      DBMS_OUTPUT.put_line('Trace started: ' || to_char(SYSDATE,'dd.mm.yyyy hh24:mi:ss'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2013-02-10
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        相关资源
        最近更新 更多