oracle 单个 .sql 文件中的 BEGIN/END 和 CREATE 表
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7397449/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
BEGIN/END and CREATE Table in single .sql file
提问by victorhooi
I have a small SQL script that I'm executing with Oracle's SQL*Plus to emulate create or replace on tables:
我有一个小的 SQL 脚本,我正在使用 Oracle 的 SQL*Plus 执行它来模拟表上的创建或替换:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE symbols';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
END IF;
END;
/
CREATE TABLE symbols (
blah blah,
blah blah,
);
EXIT;
SQL*Plus commandline is:
SQL*Plus 命令行是:
sqlplus aegsys15_owner/pass#234@MARVINUAT03 @createSymbolsTable.sql << EOF
> EOF
If I omit the forward slash (/) after END, it seems to only process the first BEGIN/END block, and ignores the CREATE TABLE section underneath. Also, it doesn't print anything help out at all - just connecting/disconnecting:
如果我在 END 之后省略正斜杠 (/),它似乎只处理第一个 BEGIN/END 块,而忽略下面的 CREATE TABLE 部分。此外,它根本不打印任何帮助 - 只是连接/断开连接:
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 13 15:49:34 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
78 Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
However, if I do have the forward slash it gives me an error:
但是,如果我确实有正斜杠,它会给我一个错误:
END IF;
*
ERROR at line 6:
ORA-06550: line 6, column 5:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
CREATE TABLE symbols (
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
Firstly, what's the best way of having both the BEGIN/END exception block at the top, and the CREATE TABLE block in the same .sql file?
首先,将 BEGIN/END 异常块放在顶部并将 CREATE TABLE 块放在同一个 .sql 文件中的最佳方法是什么?
And secondly, what's some way of getting some helpful output out of SQL*Plus? Each .sql file we run may have multiple CREATE statements (tables, indexes, synonyms etc.). Our ideal output would be something like:
其次,有什么方法可以从 SQL*Plus 中获得一些有用的输出?我们运行的每个 .sql 文件可能有多个 CREATE 语句(表、索引、同义词等)。我们理想的输出是这样的:
TABLE foo: Pass
SYNONYM bar: Fail
INDEX foo_1: Pass
Not sure if something like that is achievable with SQL or PL/SQL though - happy to write a Bash or Python wrapper script around this, if you guys think that's a better solution.
不确定这样的事情是否可以通过 SQL 或 PL/SQL 实现 - 如果你们认为这是一个更好的解决方案,很高兴围绕这个编写 Bash 或 Python 包装器脚本。
Cheers, Victor
干杯,维克多
回答by pratik garg
you forgot to put in your if statement..
你忘了把你的 if 语句..
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE symbols';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
--here you have to write something for this exception
-- if you don't have any activity to do then you can use NULL (atleast)
-- you can't put this if statement body empty in oracle
NULL;
END IF;
END;
/
and better if you use declare
also at the first line, before begin starts
如果你declare
也在第一行使用,在开始之前更好
回答by Kay Marczinzik
For output in slqplus use the prompt command. For output from pl/sql (i.e. inside a begin/end block) use the dbms_output.put_line() function.
对于 slqplus 中的输出,请使用 prompt 命令。对于 pl/sql 的输出(即在开始/结束块内)使用 dbms_output.put_line() 函数。
prompt Creating foo table
begin
create table foo...;
dbms_output.put_line('success');
exception
when others then
dbms_output.put_line('fail');
end;
/