web-dev-qa-db-ja.com

シェルスクリプトを介してsqlplusセッションに渡されたPLSQLパッケージコードをコンパイルしますか?

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
1
Vineet

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
1
BriteSponge

プロシージャブロック内から外部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
0
Andrew Brennan