以下是PLSQL代码的示例,其中我使用select查询将两列的值提取为两个变量。
execute immediate 'select c1,c2 from tableName where id = 123' into c1_val,c2_val;
我想将上面的代码设为通用的,其中列名将作为输入给出。像
这样的东西execute immediate 'select '||commaSeparatedColumns||' from tableName where id = 123' into <someThing>
在这里,由于列数不固定,我在pl sql变量中存储值时遇到问题。
有人可以建议如何实现这个目标吗?
答案 0 :(得分:3)
您无法使用execute immediate
执行此操作,您需要使用dbms_sql包。
这是一个很好的示例,您可以从 - Tom Kyte's print_table script开始,它可以运行任何select语句(包含任意数量的列)并以垂直格式打印结果。
答案 1 :(得分:1)
你可以尝试类似的东西;它有点棘手,基于一种嵌套的动态sql:
create table test_fetch_table ( id number,c1 number,c2 number,c3 number,c4 number,c5 number,c6 number,c7 number,c8 number,c9 number,c10 number)
insert into test_fetch_table values ( 123, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
create or replace procedure testFetch (commaSeparatedColumns IN varchar2) is
c1_val number;
c2_val number;
c3_val number;
c4_val number;
c5_val number;
c6_val number;
c7_val number;
c8_val number;
c9_val number;
c10_val number;
commaSeparatedVariables varchar2(1000);
vSQL varchar2(1000);
vPLSQL varchar2(1000);
begin
commaSeparatedVariables := replace (commaSeparatedColumns, ',', '_val,') || '_val';
vSQL := 'select ' || commaSeparatedColumns || ' into ' || commaSeparatedVariables || ' from test_fetch_table where id=123;';
vPLSQL := 'declare
c1_val number;
c2_val number;
c3_val number;
c4_val number;
c5_val number;
c6_val number;
c7_val number;
c8_val number;
c9_val number;
c10_val number;
begin '
|| vSQL ||
':1 := c1_val;
:2 := c2_val;
:3 := c3_val;
:4 := c4_val;
:5 := c5_val;
:6 := c6_val;
:7 := c7_val;
:8 := c8_val;
:9 := c9_val;
:10 := c10_val;
end;';
execute immediate vPLSQL using OUT c1_val,
OUT c2_val,
OUT c3_val,
OUT c4_val,
OUT c5_val,
OUT c6_val,
OUT c7_val,
OUT c8_val,
OUT c9_val,
OUT c10_val;
dbms_output.put_line(
c1_val || ',' ||
c2_val || ',' ||
c3_val || ',' ||
c4_val || ',' ||
c5_val || ',' ||
c6_val || ',' ||
c7_val || ',' ||
c8_val || ',' ||
c9_val || ',' ||
c10_val );
end;
begin
testFetch('c1,c2,c3,c4');
end;
通过这种方式,您可以定义一种包含10个字段的界面,但只能根据commaSeparatedColumns