【发布时间】:2020-01-30 11:59:54
【问题描述】:
我正在尝试创建一个动态过程,该过程填充表中已存在的数据中的表。我有两个主列变量,而不是主键列。我将一个序列(generate.nextval)传递给主键列。它将插入作为参数(数量)传递的特定行数
Create or replace procedure v_populate (table_name in varchar2, amount in number)
IS
v_pk varchar2(1000);
v_pk2 varchar2(1000);
V_dyntask LONG;
V_dyntask2 LONG;
CURSOR C1 IS
'select REPLACE(REPLACE(REPLACE(xmlagg(xmlforest(cols.column_name )
ORDER BY cols.column_name ),''</COLUMN_NAME><COLUMN_NAME>'','',''),''<COLUMN_NAME>''),''</COLUMN_NAME>'') XMLAGG --cols.column_name
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name ='''||table_name||'''AND cons.constraint_type NOT IN (''P'',''U'',''R'')
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position';
CURSOR C2 IS
'select
REPLACE(
REPLACE(
REPLACE(xmlagg(xmlforest(cols.column_name ) ORDER BY cols.column_name )
,''</COLUMN_NAME><COLUMN_NAME>'','','')
,''<COLUMN_NAME>'')
,''</COLUMN_NAME>'') XMLAGG --cols.column_name
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name ='''||table_name||'''
AND cons.constraint_type = ''P''
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position
';
BEGIN
FOR F1 in C1
LOOP
v_pk:=C1.COLUMN_NAME;
END LOOP;
FOR F2 in C2
LOOP
v_pk2:=C2.COLUMN_NAME;
END LOOP;
V_dyntask2:= 'INSERT INTO ' ||table_name|| '
( '||v_pk2||' , '||v_pk||' )
select generate.nextval,'||v_pk||'
from ' ||table_name || '
where rownum <='||amount;
EXECUTE IMMEDIATE V_dyntask2;
COMMIT;
end;
我不断收到此错误: PLS-00103:遇到符号“select REPLACE(REPLACE(REPLACE(xmlagg(xmlforest(cols.column_name)”时,期望以下之一:( select 符号“select”被替换为“select REPLACE(REPLACE(REPLACE(xmlagg( xmlforest(cols.column_name" 继续。 PLS-00103:遇到符号“;”当期望以下之一时: , * & - + / at mod 余数 rem as from ||
【问题讨论】:
-
我不会为你调试它。不过,有一条建议:不要执行它,而是先
dbms_output.put_line(v_dyntask2)并检查它是否看起来正常。当然不会——否则,它会起作用。在修复错误之前不要执行它。 -
我现在试过了,它给出了同样的错误。我对 plsql 有点陌生,可能我错过了一些东西@Littlefoot
-
PL/SQL 新手?难道你找不到比动态 SQL 更简单的东西吗?好吧,您必须重新开始,逐步创建 v_dyntask2,经常进行测试。
-
你的代码看起来很奇怪,你想达到什么目的?循环是无用的,您只需从查询中取出最后一行。在您的查询中,您首先使用
xmlagg(xmlforest(...创建 XML 对象,然后再次删除 XML 标记以获取纯文本。 -
数据类型
LONG已弃用近 20 年,请勿使用。
标签: sql oracle stored-procedures plsql oracle-sqldeveloper