【问题标题】:Print bind variables when using execute immediate使用立即执行时打印绑定变量
【发布时间】:2015-01-28 22:36:56
【问题描述】:

我试图在执行立即语句之后打印出 vSQL 变量。 我知道立即执行语句会给出 ORA-00903,因为你不能将变量绑定到表等。我只想在使用后打印该字符串 声明。

这是我的代码:

DECLARE 
vSQL VARCHAR2(100);
vOwner VARCHAR2(100);
vTableName VARCHAR2(100);
vPartition VARCHAR2(100);
BEGIN
    vOwner := 'STG';
    vTableName := 'TEMP';
    vSQL := 'ALTER TABLE :1.:2 TRUNCATE PARTITION(:3)';
    EXECUTE IMMEDIATE vSQL USING vOwner,vTableName,vPartition;
    --DBMS_OUTPUT.PUT_LINE(vSQL); -- Something like this
END;

感谢您的想法...

【问题讨论】:

  • 不允许绑定标识符。如果您只是想打印 alter table 语句,为什么execute immediate 语句在那里?除非您放弃尝试绑定标识符的想法,否则它永远不会成功执行。
  • 绑定变量不能用于设置模式对象!而是形成一个字符串,别无他法!
  • 在您的情况下,当您与绑定变量一起运行时,vSQL 永远不会被修改,如果您认为 :1 将被替换为 vOwner 值,这是不可能的 . Oracle 在执行期间执行所有替换。
  • 那么是否可以在执行期间跟踪替换?

标签: oracle plsql


【解决方案1】:

正如评论者所写,您只能将数据绑定到字段,而不能绑定库对象的名称/等。

所以我认为你只能在没有绑定的情况下做到这一点:

DECLARE 
vSQL VARCHAR2(100);
vOwner VARCHAR2(100);
vTableName VARCHAR2(100);
vPartition VARCHAR2(100);
BEGIN
    vOwner := 'STG';
    vTableName := 'TEMP';
    vSQL := 'ALTER TABLE ' || vOwner || '.' || vTableName || ' TRUNCATE PARTITION('||vPartition||')';
    EXECUTE IMMEDIATE vSQL;
    DBMS_OUTPUT.PUT_LINE(vSQL);
END;

【讨论】:

  • 你把我的问题弄错了,我已经知道如何以正确的方式处理查询。我只是想知道当代码像我的代码一样失败时如何跟踪(调试)代码。
  • 我 100% 不懂。这种替代永远不会发生。如果这只是可能发生的事情的一个假例子,那么也许某种跟踪会有所帮助,您可以从相关的 udump/etc 文件中提取内部发生的事情。
【解决方案2】:

如果你知道会发生错误,抓住它然后打印。

DECLARE 
vSQL VARCHAR2(100);
vOwner VARCHAR2(100);
vTableName VARCHAR2(100);
vPartition VARCHAR2(100);
BEGIN
    vOwner := 'STG';
    vTableName := 'TEMP';
    vSQL := 'ALTER TABLE :1.:2 TRUNCATE PARTITION(:3)';
    EXECUTE IMMEDIATE vSQL USING vOwner,vTableName,vPartition;

    EXCEPTION   --The error will get catched here.     
        WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(vSQL); --This will print exactly 'ALTER TABLE :1.:2 TRUNCATE PARTITION(:3)'
           --If you want to print it with the variables do something like:
           DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || vOwner || ', ' || vTableName || ', ' || vPartition; 

END;

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多