我正在为我的公司编写一系列用Oracle PL / SQL编写的SQL脚本。我遇到了一个基本的脚本,底部附近有一个奇怪的斜线。它以这种方式检入CVS。这是一个纯语法错误还是它有一些我不知道的功能。稍微混淆的脚本:
set serveroutput on size 2000;
--PL/SQL block to link ISSN in serial base on a company's ISSN text file
declare
cursor ItemCursor is
select issn is2 from web.obfuscated1 where issn is not null
union
select eissn is2 from web.obfuscated1 where eissn is not null;
cursor ItemCursor1(aIS varchar2) is
select obfuscated1_uid from web.obfuscated1 where group_num is null and issn in (
select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS
union
select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS
)
union
select obfuscated1_uid from web.obfuscated1 where eissn in (
select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS
union
select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS
);
cursor ItemCursor2(aIS9 varchar2) is
select obfuscated1_uid from web.obfuscated1 where issn in (
select distinct issn from web.obfuscated1 where issn = aIS9 or eissn = aIS9
union
select distinct eissn from web.obfuscated1 where issn = aIS9 or eissn = aIS9
) and group_num is null;
agroup number(8);
processCount number(8);
------------------------------------------------------
-- MAIN BLOCK -----------------------------------
-------------------------------------------------
begin
processCount := 0;
agroup := null;
for itemRec in ItemCursor loop
agroup := null;
begin
select group_num into agroup from web.obfuscated1 where issn in (
select distinct issn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2
union
select distinct eissn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2
) and group_num is not null and issn is not null and eissn is not null and rownum <= 1;
exception
when no_data_found then
agroup := null;
when others then
agroup := null;
end;
if agroup is not null then
for itemRec2 in ItemCursor2(itemRec.is2) loop
update web.obfuscated1 set group_num = agroup where obfuscated1_uid = itemRec2.obfuscated1_uid;
commit;
end loop;
else
processCount := processCount + 1;
for itemRec1 in ItemCursor1(itemRec.is2) loop
update web.obfuscated1 set group_num = processCount where obfuscated1_uid = itemRec1.obfuscated1_uid;
commit;
end loop;
commit;
end if;
end loop;
dbms_output.put_line('Total record read: ' || processCount);
exception
when others then
dbms_output.put_line('ORA' || sqlcode);
dbms_output.put_line(substr(sqlerrm, 1, 255));
dbms_output.put_line('ORA- Error during processing ' );
end;
/
exit;
答案 0 :(得分:21)
斜杠有a meaning:
执行最近执行的 SQL命令或PL / SQL块 存储在SQL缓冲区中。您可以 在命令处输入斜杠(/) 提示或在行号提示下 多行命令。斜杠命令 功能与RUN类似,但确实如此 不列出命令。
答案 1 :(得分:7)
使用Oracle时,您会“混合”三种不同的语法。
sqlplus可以通过将SQL和PL / SQL语句发送到DB服务器来执行/处理它们。 sqlplus命令由sqlplus本身解释。
分号“;”不是SQL语法的一部分,sqlplus将其识别为SQL语句的结尾。而对于PL / SQL,它是语法的一部分,必须明确告诉sqlplus该语句在此结束,并且应该使用斜杠执行。
其他sqlplus命令是“EXIT”,“DEFINE”“VARIABLE”“PRINT”“SET&lt; something&gt;” (SET ROLE除外)。
另一方面,Toad例如在看到空行时识别PL / SQL块的结束。
答案 2 :(得分:5)
基本上你输入东西然后输入“/”,你输入的内容将执行
答案 3 :(得分:3)
斜杠和“退出”都让我怀疑你应该从SQLPLUS运行这个脚本。如果您尝试以其他方式将其提交给Oracle,则可能会收到错误。在那种情况下,只需摆脱两者。
答案 4 :(得分:1)
这不是错误。它执行脚本。
当您在一个文件中将各种脚本连接在一起并希望每个脚本在下一个脚本之前执行时,它非常有用。
即创建功能 / 创建使用函数
的存储过程如果没有斜杠,存储过程可能会因错误而创建,或者可能无法创建。