2つのファイルがあります:(1)と(2)
(1)シェルスクリプト-wrapper.sh
#!/bin/sh
echo "start of Shell script"
FILE_NAME="XX_PKGb.sql"
sqlplus user/password @sql_deploy.sql $FILE_NAME
echo "end of Shell script."
exit $RETURN_CODE
(2)plsqlスクリプト-sql_deploy.sql
set serveroutput on
set term on
set echo off
set feedback off
set define on
set verify off
define SQL_SCRIPT=&1
declare
v_sql varchar2(240);
begin
v_sql := 'ALTER SESSION SET CURRENT_SCHEMA = XXEOM';
--alter the schema (this works)
EXECUTE IMMEDIATE v_sql;
--compile the package (this throws an error)
@@'&SQL_SCRIPT';
end;
/
exit;
ファイルXX_PKGb.sql
も、上記の2つのファイルと同じ場所にあります。シェルスクリプトを実行すると、sqlplus
セッションがsql_deploy.sql
スクリプトを実行することがわかりましたが、スキーマを変更できましたが、パッケージのコンパイル中に次のエラーが発生しました。このSQLファイルのコードをコンパイルするにはどうすればよいですか。
CREATE OR REPLACE PACKAGE BODY XXG_PKG
*
ERROR at line 15:
ORA-06550: line 15, column 1:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
( begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
PL/SQLブロックからXX_PKGb.sql(パッケージ作成ステートメント)を実行することはできません。そこで行う必要がある場合は、動的SQLである必要があります。
SQLPlusから実行するのがより良い方法です。
set term on
set echo off
set feedback off
set define on
set verify off
ALTER SESSION SET CURRENT_SCHEMA = XXEOM
/
@XX_PKGb.sql
/
exit
プロシージャブロック内から外部SQLスクリプトを呼び出すことはできません。 PL/SQLコンパイラにSQLPlusコマンドを発行しようとしています。それがうまくいかない理由がわかりますか?
代わりに、次の形式を使用して、通常のコマンドをシェルスクリプト内のSQLPlusにパイプしてみてください。
sqlplus / as sysdba << EOF
set serveroutput on
set term on
set echo off
set feedback off
set define on
set verify off
ALTER SESSION SET CURRENT_SCHEMA = XXEOM;
@XX_PKGb.sql;
EOF