如何将变量传递给 sqlplus 脚本并在 Oracle 查询中使用与 table-prefix 相同的变量?
How can I pass variable to sqlplus script and use same variable as table-prefix in Oracle query?
我有以下 sql 脚本,即 check_and_create_tbl.sql
DECLARE
t_count NUMBER;
BEGIN
SELECT count(*) into t_count FROM all_objects WHERE object_name = '&1_EMPLOYEE' AND object_type = 'TABLE';
if t_count <= 0 then
execute immediate 'CREATE TABLE ' || &1 || '_EMPLOYEE (
ID NUMBER(3)
, NAME VARCHAR2(30) NOT NULL
)';
end if;
END;
现在我在 bash 程序的函数中调用上面的脚本,如下所示。
function exe_orcl {
exe_command+=("/opt/bin/sqlplus -s <ORCL_USER>/<ORCL_PASS>@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<ORCL_HOST>)(PORT=<ORCL_PORT>)))(CONNECT_DATA=(SERVICE_NAME=<ORCL_SNAME>))) ")
while (( $# > 0 )); do
exe_command+=("")
shift 1
done
echo "SQLPLUS command = ${_cmd[@]}"
"${exe_command[@]}" && { echo "SQLPLUS Success"; } || { echo "SQLPLUS Failed"; }
}
function exe_orcl_sql_file {
sql_file=
prefix="TBL_SALE"
shift 1
exe_orcl << EOF
whenever oserror exit 9;
whenever sqlerror exit SQL.SQLCODE;
SET NEWPAGE NONE
@${sql_file} ${prefix} ${@};
exit
EOF
}
现在在我的 bash 程序中,我尝试执行如下 sql 文件。
exe_orcl_sql_file "/tmp/check_and_create_tbl.sql" || { echo "SQLPLUS execution error"; }
我看到的日志如下。
SQLPLUS command = /opt/bin/sqlplus -s XXXX/XXXX@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXX)(PORT=XXXX)))(CONNECT_DATA=(SERVICE_NAME=XXXX)))
SQLPLUS Success
但是我没有看到在 Oracle DB 中创建的 TBL_SALE_EMPLOYEE,请指导我在这里缺少什么?
你需要记住变量是通过sql*plus输入的,你还必须意识到'_'是变量名的有效部分所以你需要清楚地指出结束的地方应该是。
DECLARE
t_count NUMBER;
BEGIN
SELECT count(*) into t_count FROM all_objects WHERE object_name = '&1._EMPLOYEE' AND object_type = 'TABLE';
if t_count <= 0 then
execute immediate 'CREATE TABLE &1._EMPLOYEE (
ID NUMBER(3)
, NAME VARCHAR2(30) NOT NULL
)';
end if;
END;
/
我有以下 sql 脚本,即 check_and_create_tbl.sql
DECLARE
t_count NUMBER;
BEGIN
SELECT count(*) into t_count FROM all_objects WHERE object_name = '&1_EMPLOYEE' AND object_type = 'TABLE';
if t_count <= 0 then
execute immediate 'CREATE TABLE ' || &1 || '_EMPLOYEE (
ID NUMBER(3)
, NAME VARCHAR2(30) NOT NULL
)';
end if;
END;
现在我在 bash 程序的函数中调用上面的脚本,如下所示。
function exe_orcl {
exe_command+=("/opt/bin/sqlplus -s <ORCL_USER>/<ORCL_PASS>@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<ORCL_HOST>)(PORT=<ORCL_PORT>)))(CONNECT_DATA=(SERVICE_NAME=<ORCL_SNAME>))) ")
while (( $# > 0 )); do
exe_command+=("")
shift 1
done
echo "SQLPLUS command = ${_cmd[@]}"
"${exe_command[@]}" && { echo "SQLPLUS Success"; } || { echo "SQLPLUS Failed"; }
}
function exe_orcl_sql_file {
sql_file=
prefix="TBL_SALE"
shift 1
exe_orcl << EOF
whenever oserror exit 9;
whenever sqlerror exit SQL.SQLCODE;
SET NEWPAGE NONE
@${sql_file} ${prefix} ${@};
exit
EOF
}
现在在我的 bash 程序中,我尝试执行如下 sql 文件。
exe_orcl_sql_file "/tmp/check_and_create_tbl.sql" || { echo "SQLPLUS execution error"; }
我看到的日志如下。
SQLPLUS command = /opt/bin/sqlplus -s XXXX/XXXX@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXX)(PORT=XXXX)))(CONNECT_DATA=(SERVICE_NAME=XXXX)))
SQLPLUS Success
但是我没有看到在 Oracle DB 中创建的 TBL_SALE_EMPLOYEE,请指导我在这里缺少什么?
你需要记住变量是通过sql*plus输入的,你还必须意识到'_'是变量名的有效部分所以你需要清楚地指出结束的地方应该是。
DECLARE
t_count NUMBER;
BEGIN
SELECT count(*) into t_count FROM all_objects WHERE object_name = '&1._EMPLOYEE' AND object_type = 'TABLE';
if t_count <= 0 then
execute immediate 'CREATE TABLE &1._EMPLOYEE (
ID NUMBER(3)
, NAME VARCHAR2(30) NOT NULL
)';
end if;
END;
/