[英]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 中调用上面的脚本,如下所示。
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+=("$1")
shift 1
done
echo "SQLPLUS command = ${_cmd[@]}"
"${exe_command[@]}" && { echo "SQLPLUS Success"; } || { echo "SQLPLUS Failed"; }
}
function exe_orcl_sql_file {
sql_file=$1
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;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.