PL/SQL-循环插入和选择
我想要一个可重用的脚本,它可以通过交换变量值进行配置。我希望能够循环一组PL/SQL-循环插入和选择,sql,oracle,loops,plsql,insert,Sql,Oracle,Loops,Plsql,Insert,我想要一个可重用的脚本,它可以通过交换变量值进行配置。我希望能够循环一组标记ID,并为每个标记插入一行。我还想在提交之前检查插入的任一侧,以进行视觉验证 这就是我迄今为止所尝试的: set verify off; set serveroutput on; define uname = 'foobar' define f_name = 'foo' define l_name = 'bar' declare type numListType is table of number; numLi
标记ID
,并为每个标记插入一行。我还想在提交之前检查插入的任一侧,以进行视觉验证
这就是我迄今为止所尝试的:
set verify off;
set serveroutput on;
define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'
declare
type numListType is table of number;
numList numListType;
begin
numList := numListType(432,433,434,435);
for i in numList.FIRST..numList.LAST loop
dbms_output.put_line('EXPECTING 0');
select count(*)
from security_tag_tbl
where tag_id = numList(i);
dbms_output.put_line('INSERTING ROW');
insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));
dbms_output.put_line('EXPECTING 1');
select count(*)
from security_tag_tbl
where tag_id = numList(i);
end loop;
end;
/
set serveroutput off;
set verify on;
此示例的问题:
- 此示例返回select查询周围的错误李>
- 当我删除select语句时,示例代码返回带有“numList”索引的错误
关于处理此场景的正确方法有什么建议吗?好的,首先,上面的代码包含一些问题。在PL/SQL中使用SELECT时,必须将其存储在带有INTO关键字的变量中 为了重现您的问题,我使用以下脚本创建了表和序列:
create table security_tag_tbl (id number, username varchar2(200), first_name varchar2(200), last_name varchar2(200), tag_id number);
create sequence security_tag_tbl_seq;
然后,我将您的代码修改为:
set verify off;
set serveroutput on;
define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'
declare
type numListType is table of number;
numList numListType;
firstcount number;
secondcount number;
begin
numList := numListType(432,433,434,435);
for i in numList.FIRST..numList.LAST loop
dbms_output.put_line('EXPECTING 0');
select count(*)
into firstcount
from security_tag_tbl
where tag_id = numList(i);
dbms_output.put_line('GOT ' || firstcount);
dbms_output.put_line('INSERTING ROW');
insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));
dbms_output.put_line('EXPECTING 1');
select count(*)
into secondcount
from security_tag_tbl
where tag_id = numList(i);
dbms_output.put_line('GOT ' || secondcount);
end loop;
end;
/
set serveroutput off;
set verify on;
现在,您将获得有关正在发生的事情的视觉反馈。下一个问题是,当你没有得到想要的结果时该怎么办?您可以进行如下构造,根据这些计数的结果提交或回滚事务:
set verify off;
set serveroutput on;
define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'
declare
type numListType is table of number;
numList numListType;
firstcount number;
secondcount number;
errorocured boolean := false;
begin
numList := numListType(432,433,434,435);
for i in numList.FIRST..numList.LAST loop
dbms_output.put_line('EXPECTING 0');
select count(*)
into firstcount
from security_tag_tbl
where tag_id = numList(i);
dbms_output.put_line('GOT ' || firstcount);
if (firstcount != 0) then
errorocured := true;
end if;
dbms_output.put_line('INSERTING ROW');
insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));
dbms_output.put_line('EXPECTING 1');
select count(*)
into secondcount
from security_tag_tbl
where tag_id = numList(i);
dbms_output.put_line('GOT ' || secondcount);
if (secondcount != 1) then
errorocured := true;
end if;
end loop;
if errorocured = true then
dbms_output.put_line('Something wend wrong, rolling back batch');
rollback;
else
dbms_output.put_line('Everything ok, committing batch');
commit;
end if;
end;
/
set serveroutput off;
set verify on;
如果要将此代码用于更大的数字或记录,可能还需要研究批量操作。关于它的好文档可以在这里找到:上面的代码有什么问题吗?很抱歉,很好,我现在已经添加了详细信息。谢谢@BobJarvis