【发布时间】:2020-11-12 12:27:40
【问题描述】:
我正在尝试编写一个部署脚本,以便在 CI/CD 管道中使用 SQL*Plus 运行,但我无法找到解决这个看似非常基本的问题的方法。
这是脚本 release.sql 的缩短版本:
DECLARE
vnum NUMBER;
BEGIN
SELECT COUNT(tname) INTO vnum FROM tab WHERE tname = 'DA_VERSION';
IF vnum = 0 THEN -- run create scripts
@ddl/da_001.sql
@ddl/da_002.sql
@dml/version.sql -- set initial version
END IF;
END;
da_001.sql 如下所示:
CREATE TABLE TABLE_NAME
(
COLUMN1 NUMBER NOT NULL
, CONSTRAINT TABLE_NAME_PK PRIMARY KEY
(
COLUMN1
)
ENABLE
);
当我跑步时
sqlplus.exe connection_string @release.sql
我明白了
创建表 DA_PRODUCTS * 第 6 行的错误: ORA-06550:第 6 行,第 1 列: PLS-00103:在预期以下之一时遇到符号“CREATE”:...
所以它不喜欢 da_001.sql 开头的 CREATE 语句,但我不知道为什么。我在这里错过了什么?
【问题讨论】:
-
PL/SQL 语言没有
CREATE关键字。您需要execute immediate或其他方法。 -
@是sqlplus命令,而不是 SQL 甚至 PL/SQL 命令。它只能用于sqlplus命令行。 PL/SQL 代码在服务器上运行,没有任何关于使用哪个客户端工具调用它甚至访问客户端上的文件的概念。 -
@a_horse_with_no_name 如果这是 SQL*Plus 脚本的一部分,但是,SQL*Plus 会在执行之前将引用的脚本嵌入到 PL/SQL 块中。不过,引用的脚本必须是有效的 PL/SQL。
-
@WilliamRobertson:你确定吗?这将需要 sqlplus 在将 PL/SQL 块发送到服务器之前解析 PL/SQL 主体并用实际文件内容替换对文件的引用。
-
在第一个脚本中,最后缺少“/”。没有这个,它假定
CREATE TABLE是 PLSQL 块的一部分。