17,082
社区成员
发帖
与我相关
我的任务
分享
CREATE TYPE ColList IS TABLE OF VARCHAR2(2000);
DECLARE
names ColList;
BEGIN
names := ColList('Com');
tmp_value VARCHAR2(2000);
FOR one_row IN c_111 LOOP
FOR i IN 1..names.COUNT LOOP
EXECUTE IMMEDIATE 'SELECT one_row.' || names(i) || ' FROM DUAL '
INTO tmp_value;
EXECUTE IMMEDIATE 'UPDATE one_table r '
|| ' SET r.cause = r.cause || (SELECT ''' || names(i) || ':'' || l.' || names(i)
|| ' FROM table2 l '
|| ' WHERE l.colA = '' || tmp_value || '''';
END LOOP;
END LOOP;
DECLARE
TYPE COLLIST IS TABLE OF VARCHAR2(2000);
NAMES COLLIST;
TMP_VALUE VARCHAR2(2000);
STR_SQL VARCHAR2(2000);
COLL VARCHAR2(30);
BEGIN
NAMES := COLLIST('ID', 'NAME');
FOR I IN 1 .. NAMES.COUNT LOOP
-- 利用动态游标,只取出一个列
-- performance就不考虑,反正是一次执行,慢点就慢点吧
OPEN cur_111 FOR 'SELECT ' || names(i) || ' AS rValue FROM TEST2';
LOOP
FETCH cur_111 INTO one_remote_value;
EXIT WHEN cur_111%NOTFOUND;
-- 下面就不改了。思路表达清楚就可以了
STR_SQL := 'UPDATE one_table r ' ||
' SET r.cause = r.cause || (SELECT ''' || NAMES(I) ||
':'' || l.' || NAMES(I) || ' FROM test2 l ' ||
' WHERE l.colA = ''' || TMP_VALUE || ''')';
DBMS_OUTPUT.PUT_LINE(STR_SQL);
/*EXECUTE IMMEDIATE 'UPDATE one_table r ' ||
' SET r.cause = r.cause || (SELECT ''' ||
NAMES(I) || ':'' || l.' || NAMES(I) ||
' FROM table2 l ' ||
' WHERE l.colA = ''' ||
TMP_VALUE || '''';*/
END LOOP;
END LOOP;
END;
/
你的需求恐怕无法完成,只能改别的思路了.不能实现的原因是execute immediate 不接受非内置常规变量(我们这里就是cursor的一行数据).
DECLARE
TYPE COLLIST IS TABLE OF VARCHAR2(2000);
NAMES COLLIST;
CURSOR C_111 IS
SELECT * FROM TEST2;
TMP_VALUE VARCHAR2(2000);
STR_SQL VARCHAR2(2000);
COLL VARCHAR2(30);
BEGIN
NAMES := COLLIST('ID', 'NAME');
FOR ONE_ROW IN C_111 LOOP
FOR I IN 1 .. NAMES.COUNT LOOP
/* --用这个plsql是可以把值赋给tmp_value的
BEGIN
TMP_VALUE := ONE_ROW.id;
END;*/
/*--这里无法把ONE_ROW 传给plsql块,因为oracle不允许.会报pls-00457 错误
EXECUTE IMMEDIATE 'begin :x :=:y.'||names(i)||';end;' USING IN OUT tmp_value,one_row;
*/
/*--你写的这个根本不符合oracle的语法,更是错误
EXECUTE IMMEDIATE 'SELECT one_row.' || names(i) || ' FROM DUAL '
INTO tmp_value;
*/
STR_SQL := 'UPDATE one_table r ' ||
' SET r.cause = r.cause || (SELECT ''' || NAMES(I) ||
':'' || l.' || NAMES(I) || ' FROM test2 l ' ||
' WHERE l.colA = ''' || TMP_VALUE || ''')';
DBMS_OUTPUT.PUT_LINE(STR_SQL);
/*EXECUTE IMMEDIATE 'UPDATE one_table r ' ||
' SET r.cause = r.cause || (SELECT ''' ||
NAMES(I) || ':'' || l.' || NAMES(I) ||
' FROM table2 l ' ||
' WHERE l.colA = ''' ||
TMP_VALUE || '''';*/
END LOOP;
END LOOP;
END;
/