我们本周在我的公司一直在讨论如何编写SQL脚本.
背景:我们的数据库是Oracle 10g(很快升级到11).我们的DBA团队使用SQLPlus将脚本部署到生产环境.
现在,我们最近部署失败,因为它使用了分号和正斜杠(/).分号在每个语句的末尾,斜杠在语句之间.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Run Code Online (Sandbox Code Playgroud)
稍后在脚本中添加了一些触发器,创建了一些视图以及一些存储过程.同时具有;与/导致每个语句运行两次导致错误(尤其是在插入,是唯一的,其需要).
在SQL Developer中,这不会发生,在TOAD中这不会发生.如果你运行某些命令,如果没有它们,它们将无法工作/.
在PL/SQL中,如果你有子程序(DECLARE,BEGIN,END),使用的分号将被视为子程序的一部分,因此你必须使用斜杠.
所以我的问题是:如果您的数据库是Oracle,那么编写SQL脚本的正确方法是什么?既然你知道你的数据库是Oracle应该总是使用/?
我正在尝试在PL/SQL中创建一个表
我怎么能做到这一点?
继续
错误报告:
ORA-00933:"SQL命令未正确结束"
这是我有错误的代码
DECLARE
station_id_ms1 NUMBER :=10347;
realtime_start DATE :=to_date('2012-01-01 00:00:00','YYYY-DD-MM HH24:MI:SS');
realtime_end DATE :=to_date('2012-07-01 00:00:00','YYYY-DD-MM HH24:MI:SS');
BEGIN
EXECUTE IMMEDIATE ('
CREATE TABLE new_table_name
AS
SELECT
((realtime - to_date(''01-JAN-1970'',''DD-MON-YYYY'')) * (86400)) AS realtime_ms1,
magnetic_ms_id,
ADC_value_pp_2_mgntc_fld_amp(ch2_value,ch2_gain_value,magnetic_ms_id,2) AS B_x_ms1,
ADC_value_pp_2_mgntc_fld_amp(ch1_value,ch1_gain_value,magnetic_ms_id,1) AS B_y_ms1,
real_nanosecs2*4/3*360/20e6 AS phase_x_ms1,
real_nanosecs1*4/3*360/20e6 AS phase_y_ms1
FROM
raw_mag
WHERE
magnetic_ms_id = '||station_id_ms1||'
AND realtime > '||realtime_start||'
AND realtime < '||realtime_end||'
AND ch1_tune_value = 0
AND realtime < pkg_timezone.change_timezone(gettime,''CET'',''UTC'')
');
END;
Run Code Online (Sandbox Code Playgroud) 我正在尝试执行或运行以下 pl/sql 脚本:
SET serveroutput on;
CREATE OR REPLACE PROCEDURE findAvg
(p_category IN products.category_id% TYPE, c OUT NUMBER)
AS
BEGIN
SELECT NVL ((SELECT AVG(LIST_PRICE) FROM products
WHERE p_category = category_id), -1) into p_category
from dual;
END findAvg;
DECLARE
cat products.category_id%TYPE;
Price products.List_price%TYPE;
BEGIN
cat := &p_category;
findAvg (cat, price);
if (price = -1) then
dbms_output.put_line('Wrong Category ');
ELSE
dbms_output.put_line('the average price for category' || cat || ' is ' || price);
END IF;
END;
/
show errors
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行它时,我收到此错误消息(我只能在显示错误后才能看到它):
PLS-00103: Encountered …Run Code Online (Sandbox Code Playgroud)