【发布时间】:2018-08-23 03:33:18
【问题描述】:
我有一个来自表“test_inter”的选择语句的结果集。 我使用它在具有 id 的其他表中插入条目(按序列递增),同时从结果集插入循环中,我收到错误
--Edit starts
BEGIN
l_sql := 'select null as rid,null as rtype, null as sid,null as cid, null as pid,mid ,name, origin ,ctry, instyle,null as mapct,null as defspct,null as addspct,null as opct ';
FOR i IN 1 .. n_vers
LOOP
l_sql := l_sql || ', max( case when verorder = ' || i || ' then hoing else 0 end ) as h' || i;
l_sql := l_sql || ', max( case when verorder = ' || i || ' then hoingpct else 0 end ) as p' || i;
END LOOP;
FOR i IN n_vers + 1 .. max_vers
LOOP
l_sql := l_sql || ', max( case when verorder = ' || i || ' then hoing else null end ) as h' || i;
l_sql := l_sql || ', max( case when verorder = ' || i || ' then hoingpct else null end ) as p' || i;
END LOOP;
l_sql := l_sql || ', rowgroup, sid,null as sname, null as hoingorder, null as plead, null as cneutral, null as notnullcol,null as notnullcolindex, null as SECPCT from
(select mid ,name, origin ,ctry, instyle ,cid, cverid, verorder, hoingpct, hoing,rowgroup,sid
from test_inter
where rid = ' || n_rid || ' and sid = ''' || c_sid || ''' and rtype = ' || n_rtype || ' and pid = ' || n_pid || ' order by verorder ) group by mid ,name, origin ,ctry, instyle,rowgroup,sid ';
--n _vars and max_vars are constant values
-- Edit Ends
EXECUTE immediate l_sql; -- gives me result set
OPEN rc FOR l_sql;
LOOP
FETCH rc INTO cp_row;
IF rc%FOUND THEN
INSERT
INTO test_final
(
id , --: ORA-01007: variable not in select list"
rid ,
rtype ,
-- more fields
)VALUES
( seq.nextval,
cp_row.rid,
cp_row.rtype,
-- more values);
ELSE
EXIT;
END IF;
--exit when rc%NOTFOUND;
END LOOP;
CLOSE rc;
END;
我收到错误“原因:java.sql.SQLException:ORA-01007:变量不在选择列表中”,而我正在尝试生成 id 并插入它。 我还需要插入序列,当在表 test_final 中插入任何行时,我该怎么做?这方面的任何线索都会有所帮助。
编辑 2
我的问题和这个问题差不多
我想为表“test_final”生成序列,但我无法使用 nextval。
谢谢
【问题讨论】:
-
为什么要使用动态SQL?
l_sql到底是什么?你不能直接在游标 FOR 循环中使用它并做你正在做的事情吗?或者,更好的是,完全避免循环和/或 PL/SQL,并在 SQL 级别使用单个 INSERT 语句完成所有操作? -
我不想混淆,所以没有添加 select 语句是如何从 l_sql 构建的。我已经编辑了问题并添加了那部分。 'select' 语句不是直截了当的,所以我认为单个插入语句在这里是不可能的。请建议。谢谢
-
关于顺序,假设您使用的是 12.1 或更高版本,给表格一个 identity column 并忘记它可能会更简单。