sql - 如何在 pl sql 脚本中打印 select 语句?

标签 sql oracle plsql dynamic-sql

我有两个数组,我在其中存储了一些有效的表值,并在 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,您也需要选择 某些东西,它必须在语句的动态部分之外。事实上,对于动态 SQL,如果不这样做,查询将被解析但不会执行。 (其他 DML 和 DDL 的行为当然不同。)您的第二个 block 有 into dest 但在查询字符串中,它什么也没做;并且您不能从匿名 block 返回值。

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 中没有任何一对条件值的匹配行,那么您将得到一个未找到数据的异常,因此您需要决定这是否可能以及您要做什么如果发生这种情况,我想做。

看起来这并不真的需要动态 - 我在 fiddle 中使用了一个静态版本:

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

dbms_output.put_line(dest);

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

关于sql - 如何在 pl sql 脚本中打印 select 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57869570/

相关文章:

具有附加条件的 MySQL GROUP BY

SQLite,多对多关系,如何聚合?

sql - 如何在sql server中进行交易技术分析计算?

oracle - oracle apex 中的预渲染和后渲染

Oracle 使用参数调用作业

sql - 提取通用函数中两行之间的差异(Oracle 触发器)

sql - FRM-40735 : When button pressed trigger raised unhandled exception ORA-06502

php - PDO 连接在真实服务器 PDO->__construct/LINUX 与 WINDOWS 服务器上失败

C# 从 Oracle 存储过程返回结果集并填充 DataTable

oracle - DBMS_LOB.SUBSTR() 抛出 "character string buffer too small"错误