我遇到一个问题已经有一段时间了,我真的不知道如何做我想做的事。
考虑到下面的Cursor,我从表中读取了所有ID,其中一列包含变量中的所有值。使用这个光标,我确定了要从表中删除的所有记录。到目前为止还不错。
因为我将从数据库中删除一些行,所以我想首先将受影响的行保存为INSERT INTO格式。为此,我使用";选择/*插入*/*";来自SQL Developer的提示。
不幸的是,我的问题来了。我找不到使用DBMS_Output.PUT_LINE在SCRIPT输出中显示SELECT结果的方法;PL/SQL:ORA-00947:没有足够的值";错误消息。
你们知道我该怎么解决我的问题吗?
我的代码是:
DECLARE CURSOR C2 is
select my_id from my_table where my_id in (v_id);
BEGIN
for i in C2 LOOP
SELECT my_second_id into v_test from my_table where my_id = i.my_id;
DBMS_OUTPUT.PUT_LINE('A DELETE has to be performed within my_table, for the following ID: '||v_test);
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('The Backups are as follows: ');
select /*insert*/ * into v_why_does_it_not_work from my_table where my_id = i.my_id;
DBMS_OUTPUT.PUT_LINE(v_why_does_it_not_work);
END LOOP;
END;
我的输出是:
Error report -
ORA-06550: line 30, column 70:
PL/SQL: ORA-00947: not enough values
ORA-06550: line 30, column 37:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我希望我的输出是这样的:
A DELETE has to be performed within my_table, for the following ID: my_second_id
The Backups are as follows:
Insert into my_table (col1,col2,col3,col4,col5,col6) values (val1,val2,val3,val4,val5,val6);
这显然是错误的:
DBMS_OUTPUT.PUT_LINE('The Backups are as follows: '
select /*insert*/ * into v_why_does_it_not_work
因为你还没有终止第一行;应该是
DBMS_OUTPUT.PUT_LINE('The Backups are as follows:');
select /*insert*/ * into v_why_does_it_not_work
由于错误本身,Oracle说它在第30行第70列。你发布的代码没有30行,所以我不知道这是错误的还是其他什么。
不过,我建议您避免select *
-始终指定您正在使用的所有列。
好吧,抛开打字错误不谈,但那根本不管用。您说过您使用了提示。不,这只是一个评论,不是一个暗示。
此外,如果要创建INSERT INTO
语句,则必须使用动态SQL,将其值存储到变量中并显示(使用DBMS_OUTPUT.PUT_LINE
(。
或者,考虑将旧的(已删除的(值存储到您自己的审计表中。我们使用数据库触发器来做到这一点。