如何将表名分配给变量并在立即执行语句中使用相同的

Posted

技术标签:

【中文标题】如何将表名分配给变量并在立即执行语句中使用相同的【英文标题】:How to assign a table name to a variable and using the same inside immediate execute statement 【发布时间】:2014-01-29 07:54:21 【问题描述】:

我正在尝试将表名分配给变量并在执行立即语句中使用相同的名称,请帮助我了解执行语句中的语法

场景是

我试图在过程中传递一个表名作为参数,并在执行立即使用它们来写入其他表。

请建议我输入参数和执行立即语句的语法。

我的程序:

CREATE OR REPLACE PROCEDURE tep
AS
  v_sql VARCHAR2(1024) ;
  a     NUMBER;
  b     VARCHAR2(30) :='t_stg1_non_silicon_purchace_re';
BEGIN
  v_sql := q'[SELECT COUNT(*) FROM b ]';
  EXECUTE immediate v_sql INTO a;
  DBMS_OUTPUT.PUT_LINE( TO_CHAR(v_sql));
  DBMS_OUTPUT.PUT_LINE( TO_CHAR(a));
END;
/

【问题讨论】:

SO 已经有很多关于这个主题的答案。 Follow this link。哪一个真正适合您的情况取决于您未提供的详细信息。但我建议你浏览其中的一些。如果它们没有帮助,您需要完善您的问题。 请在发布问题之前检查现有的解决方案 创建或替换过程 tep 为 v_sql VARCHAR2(1024) ;一个号码; b varchar2(30) :='t_stg1_non_silicon_purchace_re';开始 v_sql := q'[SELECT COUNT(*) FROM b ]';立即执行 v_sql 到 a; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_sql)); DBMS_OUTPUT.PUT_LINE(TO_CHAR(a));结尾;我正在尝试这个 【参考方案1】:

您尚未在立即执行中指定您想要对表名做什么,因此请参阅下面的示例,了解如何“创建”一个表。

DECLARE 
vTableName VARCHAR2(40 CHAR);
vSQL VARCHAR2(1000 CHAR);
BEGIN
    vTableName:='MY_TABLE_NAME';
    vSQL:='CREATE TABLE ' || vTableName || ' (COL1 NUMBER, COL2 NUMBER)';
    EXECUTE IMMEDIATE vSQL;
END;
/

【讨论】:

请帮我在这里创建或替换过程 tep 为 v_sql VARCHAR2(1024) ;一个号码; b varchar2(30) :='t_stg1_non_silicon_purchace_re';开始 v_sql := q'[SELECT COUNT(*) FROM b ]';立即执行 v_sql 到 a; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_sql)); DBMS_OUTPUT.PUT_LINE(TO_CHAR(a));结束; 执行此语句时需要使用USING关键字将表名传递给SQL。 v_sql := q'[SELECT COUNT(*) FROM :1 ]'; EXECUTE IMMEDIATE v_sql INTO a1 USING b; 创建或替换过程 tep 为 v_sql VARCHAR2(1024) ;一个号码; b varchar2(30) :='t_stg1_non_silicon_purchace_re';开始 v_sql := q'[SELECT COUNT() FROM using b ]';立即执行 v_sql INTO a ; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_sql)); / DBMS_OUTPUT.PUT_LINE(TO_CHAR(a)); */ 结束; 其实我可能错了。您可能无法在此上下文中使用绑定变量。而是按如下方式构建您的 v_sql: v_sql := '[SELECT COUNT(*) FROM ' ||乙;然后,立即执行 v_sql INTO a1; 太棒了。很高兴听到。有机会对我之前的评论投赞成票吗? ;-)【参考方案2】:
This query may satisfy your requirement. Thanks

    CREATE OR REPLACE PROCEDURE tep
    AS
      v_sql VARCHAR2(1024) ;
      a     NUMBER;
      b     VARCHAR2(30) :='t_stg1_non_silicon_purchace_re';
    BEGIN
      v_sql := 'SELECT COUNT(*) FROM'||' '||b;
      EXECUTE immediate v_sql INTO a;
      DBMS_OUTPUT.PUT_LINE( TO_CHAR(v_sql));
      DBMS_OUTPUT.PUT_LINE( TO_CHAR(a));
    END;

【讨论】:

以上是关于如何将表名分配给变量并在立即执行语句中使用相同的的主要内容,如果未能解决你的问题,请参考以下文章

当他们的分数相等时,如何将排名分配给他们共享最高排名的学生?

如何在执行立即语句中包含变量?

浅谈for...in与for....of

为啥我不能在立即执行语句中使用绑定变量?

如何从数组中获取值并在zend框架工作中分配给视图

用JAVA快速的将一个表中的数据导入到另一个表里