Oracle PL/SQL:使用循环修改变量并返回结果

Oracle PL/SQL: modify a variable using a loop and return the result

提问人:Mihail 提问时间:11/14/2023 更新时间:11/15/2023 访问量:39

问:

假设我有这张虚拟桌子。

create table dummy_table as
select 'A' letter from dual
union all
select 'B' letter from dual;

...并且需要将字母列中的所有值连接到一个 CLOB 变量中,每个值从新行开始。

我一直在尝试沿着这些思路做一些事情,但不幸的是,我对 PL/SQL 的了解有限,因此它不起作用。下面的代码不起作用,但传达了这个想法。

var my_text clob; -- def? define? declare?

begin
 for c in ( select letter from dummy_table ) 
  loop
    my_text := my_text  || c.letter || chr(10);
  end loop;
end;

最后,需要能够输出结果

print(my_text); -- dbms_output.put_line(my_text)? dbms_sql.return_result(my_text)?

当它说 时,打印返回一个空变量。PL/SQL procedure successfully completed.my_value

使用 SQL Developer 和 Oracle 19c。

SQL PLSQL 预言机19c

评论


答:

1赞 Koen Lostrie 11/15/2023 #1

一种选择是创建一个返回 clob 的函数,并使用以下命令显示结果:dbms_output

koen 19c > create table dummy_table as
  2  select 'A' letter from dual
  3  union all
  4* select 'B' letter from dual;

Table DUMMY_TABLE created.

koen 19c > create or replace function print_concatenated_text return clob as 
  2    l_my_text clob; 
  3  begin
  4   for c in ( select letter from dummy_table ) 
  5    loop
  6      l_my_text := l_my_text  || c.letter || chr(10);
  7    end loop;
  8    return l_my_text;
  9  end print_concatenated_text;
 10* /

Function PRINT_CONCATENATED_TEXT compiled

koen 19c > set serveroutput on
koen 19c > begin 
  2     dbms_output.put_line(print_concatenated_text);
  3  end;
  4* /
A
B



PL/SQL procedure successfully completed.
2赞 MT0 11/15/2023 #2

VAR是 和 的缩写,是一个 SQL*Plus 命令,用于定义用于客户端应用程序(即 .SQL*Plus、SQL Developer 或 SQLcl)的绑定变量。它不是 PL/SQL 命令。同样,是一个 SQL*Plus 命令,不是 SQL 或 PL/SQL 语言的一部分。VARIABLEPRINT

如果要使用绑定变量,则需要在SQL或PL / SQL中使用绑定变量时为其添加前缀。:

VARIABLE my_text clob;

BEGIN
  FOR c IN (SELECT letter FROM dummy_table) 
  LOOP
    :my_text := :my_text  || c.letter || chr(10);
  END LOOP;
END;
/

PRINT my_text;

-- or

BEGIN
  DBMS_OUTPUT.PUT_LINE(:my_text);
END;
/

但是,如果您想在 PL/SQL 块中执行此操作(并且不使用基于客户端的绑定变量),则使用局部变量并使用:DECLARE

DECLARE
  my_text CLOB;
BEGIN
  DBMS_OUTPUT.ENABLE();

  FOR c IN (SELECT letter FROM dummy_table) 
  LOOP
    my_text := my_text  || c.letter || chr(10);
  END LOOP;

  DBMS_OUTPUT.PUT_LINE(my_text);
END;
/

评论

0赞 Mihail 11/15/2023
使用前缀有效!但其他选项没有。在第一种情况下,var 是在 PL/SQL 块之外创建的,调用会弹出一个“Enter Binds”窗口提示,该提示为空。PL/SQL 块中的第二个选项是 ,但没有显示其他输出。:DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINE(:my_text)successfully completed
0赞 Mihail 11/15/2023
弄清楚了,需要在 Dbms 输出面板中查看。