我有一个用例,我想写一个动态SQL,它会根据另一个表动态地选择列名。
查询1:从MONTHS_MAPPING中选择T_SERIES_VALUE,其中TIME_PERIOD =“2023年6月”;-- T66为输出
查询2:在MAIN_TABLE中选择aaaa,bbbb,***OUTPUT OF QUERY 1***作为'Current_Month';
由于我无法在这个用例中处理sql函数/proc中的多个列,所以我创建了一个对象/表的sql类型,然后使用批量收集,如下所示。程序正在编译。但是当我执行proc时,我得到了不一致的数据类型错误。但是我看到对象类型的数据类型和来自MAIN_TABLE的db值是同一个。
我试着在下面:
类型1:
create or replace type cds_type_o1 as Object
(
aaaa VARCHAR2(26 BYTE)
,bbbb VARCHAR2(256 BYTE)
,Tx NUMBER(38,10)
);
类型2:创建或替换类型cds_type_t1是cds_type_o1的表;
过程:
create or replace procedure test_bulk_collect_table (reporting_period IN VARCHAR2)
is
v_cm_sql varchar2(256);
v_cm varchar2(256);
v_output_execute varchar2(256);
v_output cds_type_t1;
begin
v_cm_sql:='select T_SERIES_VALUE from MONTHS_MAPPING where TIME_PERIOD = '||reporting_period; -- T61
execute immediate v_cm_sql into v_cm; --T66
v_output_execute:= 'select aaaa, bbbb, '|| v_cm ||' from MAIN_TABLE';
dbms_output.put_line(v_output_execute); --select aaaa, bbbb, T66 from MAIN_TABLE
*execute immediate v_output_execute bulk collect into v_output;* --Here I am getting the error while executing it
dbms_output.put(v_output(0).scenario);
for i in v_output.first..v_output.last loop
dbms_output.put(v_output(i).aaaa);
end loop;
end test_bulk_collect_table;
现在,当我执行这个过程作为SET SERVEROUTPUT ON; EXEC test_bulk_collect_table('JUN-2023');
我得到下面的错误:错误报告- ORA-00932:不一致的数据类型:预期UDT得到CHAR ORA-06512:在“SCHEMA.TEST_BULK_COLLECT_TABLE”,第15行(执行立即v_output_执行批量收集到v_output中)ORA-06512:100932号线00000 -“不一致的数据类型:预期的%s得到了%s”* 原因:
- 行动:
我对这个错误感到困惑,因为它期望%s,它也得到%s,对此的任何指导都将非常感谢。
3条答案
按热度按时间00jrzges1#
要获取(或批量收集)到对象列表中,您需要选择 * 对象 * 而不是列。因此,你只需要在查询中添加一个对象构造函数,例如
cs7cruho2#
你是不是把事情搞复杂了你得到的错误是由于康纳已经说过的,但是-因为你发布的代码中没有任何动态的东西,为什么你要使用动态SQL?一切都可以做得简单得多。这里有一个演示。
示例表:
类型:
程序:
测试:
bmp9r5qi3#
我是不是错过了最明显的?如果只使用一个 * 标量子查询 * 并在sql中实现呢?