简体   繁体   English

如何将变量传递给 sqlplus 脚本并在 Oracle 查询中使用与表前缀相同的变量?

[英]How can I pass variable to sqlplus script and use same variable as table-prefix in Oracle query?

I am having following sql script namely check_and_create_tbl.sql我有以下 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;

Now I am calling above script in my bash program's function like below.现在我在我的 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
}

Now in my bash program I try to execute sql file like below.现在在我的 bash 程序中,我尝试执行 sql 文件,如下所示。

exe_orcl_sql_file "/tmp/check_and_create_tbl.sql" || { echo "SQLPLUS execution error"; }

I am seeing the log as below.我看到的日志如下。

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

But I do not see the TBL_SALE_EMPLOYEE created in Oracle DB, please guide me as to what am i missing here?但是我没有看到在Oracle DB 中创建的 TBL_SALE_EMPLOYEE,请指导我这里缺少什么?

You need to remember that the variable is input by sql*plus, you also have to realise that '_' is a valid part of a variable name so you need to clearly point out where the end should be.您需要记住该变量是由 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM