【问题标题】:How to print select statment in a plsql script?如何在 pl sql 脚本中打印 select 语句?
【发布时间】:2020-01-12 03:20:15
【问题描述】:

我有两个数组,其中存储了一个表的一些有效值,并将它们传递到 SELECT 语句中。我这样做是为了让数组ab 值相应地输入where 条件。

我正在使用EXECUTE IMMEDIATE 打印SELECT 语句,我尝试将SELECT 语句的值插入变量并通过dbms_output.put_line 打印它,但它给出了错误。

我的代码不打印任何东西,它只是显示程序已完成。

DECLARE
  dest temp_1.destination%type;
  type arr1 IS VARRAY(4) OF VARCHAR2(50); 
  sd arr1; 
  type arr2 IS VARRAY(4) OF VARCHAR2(50); 
  sid1 arr2; 
  total integer;
BEGIN
 sd := street_directional('a','b','c','d');
 sid1 := street_direction('1','2','3','4');
   total := sd.count;
   FOR i in 1 .. total LOOP 
      execute immediate q'[select destination from temp_1 where cond1 =(:var1) and cond2 = (:var2) ]' using sd(i),sid1(i);  

   END LOOP; 
END;

这不会给出任何输出,它只是显示程序完成。

我试过这样做:

execute immediate q'[select destination from temp_1 where cond1 =(:var1) and cond2 = (:var2) into dest]' using sd(i),sid1(i); 
      return dest;
-- or printline
dbms_output.put_line(dest);

但它给出了一个错误。 我保留了 serveroutput on 并在 oracle 引擎上运行它。

如果除了使用 PL/SQL 之外还有其他简单的方法可以得到结果,请告诉我。

【问题讨论】:

    标签: sql oracle plsql dynamic-sql


    【解决方案1】:

    尝试设置dbms_output.enable(null) 喜欢:

    execute immediate q'[select destination from temp_1 where cond1 =(:var1) and cond2 = (:var2)]'
      into dest
      using sd(i),sid1(i); 
    
    dbms_output.enable(null);
    dbms_output.put_line(dest);
    

    或对文件启用spooling

    spool on to 'output.txt';
    execute immediate q'[select destination from temp_1 where cond1 =(:var1) and cond2 = (:var2)]'
      into dest
      using sd(i),sid1(i); 
    
    spool off;
    

    也检查ask tom

    【讨论】:

    • 这更像是一个评论而不是一个答案,因为所有细节都在指向其他网站(以及另一座城堡)的链接后面。如果包含相关部分并给出如何将其应用于 OP 情况的示例会更好。
    • 您的假脱机文档链接指向不同的 Oracle 产品,而不是数据库。假脱机是a client command 并且没有那种语法;并且不能在 PL/SQL 块内。客户端必须打开假脱机,然后执行块 - 块仍然必须使用dbms_output。所以我认为 spool 在这里有点牵强。
    【解决方案2】:

    即使使用动态 SQL,您也需要选择 into 某些内容,该内容必须在语句的动态部分之外。事实上,对于动态 SQL,如果您不这样做,则查询会被解析但不会被执行。 (当然,其他 DML 和 DDL 的行为不同。)您的第二个块有 into dest 但在查询字符串内,它没有做任何事情;并且您不能从匿名块返回值。

    execute immediate q'[select destination from temp_1 where cond1 =(:var1) and cond2 = (:var2)]'
      into dest
      using sd(i),sid1(i); 
    
    dbms_output.put_line(dest);
    

    db<>fiddle

    您仍然需要在您的客户端中拥有 set serveroutput on 或等效项,才能看到 dest 输出。如果temp_1 中的任何一对条件值都没有匹配的行,那么您将得到一个 no-data-found 异常,因此您需要确定这是否可能以及如果它想要做什么发生。

    看起来这并不需要是动态的 - 我在小提琴中包含了一个静态版本,使用:

    select destination into dest from temp_1 where cond1 = sd(i) and cond2 = sid1(i);
    
    dbms_output.put_line(dest);
    

    ...甚至是真正的 PL/SQL,但大概是一个练习。

    【讨论】:

      【解决方案3】:

      为什么要使用立即执行?您可以在 plsql 中打印 select 语句,如下所示。

          DECLARE
        dest temp_1.destination%type;
        type arr1 IS VARRAY(4) OF VARCHAR2(50); 
        sd arr1; 
        type arr2 IS VARRAY(4) OF VARCHAR2(50); 
        sid1 arr2; 
        total integer;
      BEGIN
       sd := arr1('a','b','c','d');
       sid1 := arr2('1','2','3','4');
         total := sd.count;
         FOR i in 1 .. total LOOP 
            select destination into dest from temp_1  where cond1 =sd(i) and cond2 = sid1(i) ;
            dbms_output.put_line(dest);  
         END LOOP; 
      END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多