提问人:Mihail 提问时间:11/14/2023 更新时间:11/15/2023 访问量:39
Oracle PL/SQL:使用循环修改变量并返回结果
Oracle PL/SQL: modify a variable using a loop and return the result
问:
假设我有这张虚拟桌子。
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。
答:
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 语言的一部分。VARIABLE
PRINT
如果要使用绑定变量,则需要在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_LINE
DBMS_OUTPUT.PUT_LINE(:my_text)
successfully completed
0赞
Mihail
11/15/2023
弄清楚了,需要在 Dbms 输出面板中查看。
评论