2016-09-23 3 views
0

次のものを含むSQLファイルがあります。 v $データベースのCDB列は、無関係品)11SQLスクリプトは、DBホスト上で実行されるか、別のホスト上で実行されるかに応じて動作が異なります

より大きい私はSYSDBA @ 1000年60 10 abc.sql

として/ SQLPLUS SQLPLUSを使用して、DBホスト上で実行するときに正常に動作しかし、私はリモートこのDBホストに接続するとき接続文字列を使用して、CDB列が存在しない場合は「無効な識別子」と文句を言います(指定したバージョンの値に関係なく)

Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 
With the Partitioning, Real Application Clusters, Automatic Storage 
Management, Oracle Label Security, 
OLAP, Data Mining, Oracle Database Vault and Real Application Testing options 
. 
old 2: num_ret_period NUMBER(9) := 
new 2: num_ret_period NUMBER(9) := 43200; 
old 3: num_interval NUMBER(9) := 
new 3: num_interval NUMBER(9) := 60; 
old 5: lcm_version NUMBER(4) := 
new 5: lcm_version NUMBER(4) := 1; 
    SELECT CDB INTO isCDB from v$database; 
      * 
ERROR at line 10: 
ORA-06550: line 10, column 12: 
PL/SQL: ORA-00904: "CDB": invalid identifier 
ORA-06550: line 10, column 5: 
PL/SQL: SQL Statement ignored 

なぜでしょうか?あなたはそれがまだ解析される必要があるif version > 11に守られたコードを実行する予定がない場合でも

DECLARE 
num_ret_period NUMBER(9) := &1; 
num_interval NUMBER(9) := &2; 
isCDB VARCHAR2(10); 
version NUMBER(4) := &3; 

BEGIN 

    IF version > 11 THEN 
    SELECT CDB INTO isCDB from v$database; 
    IF (isCDB = 'YES') THEN 
     EXECUTE IMMEDIATE 'ALTER session SET CONTAINER = CDB$ROOT'; 
     dbms_output.put_line('CDB is set to YES'); 
    ELSE 
     dbms_output.put_line('CDB is set to NO'); 
    END IF; 
    END IF; 

    callSomeProcedure(); 

    commit; 
EXCEPTION 
      when others then 
        dbms_output.put_line('There is an exception in abc.sql' || SQLCODE || ' ' || SQLERRM); 
        ROLLBACK; 
        raise_application_error(-20001, 'There is an exception in abc.sql' || SQLCODE || ' ' || SQLERRM); 

    END; 
    /
+0

を参照してください?その後、バナーには何が表示されますか? –

+0

説明が追加されました。バージョンはOracleに関連していませんが、私が議論を通している他の製品です。 – Pha3drus

+0

しかしデータベースのバージョンは重要です。これは12cデータベースではコンパイルされますが、11gデータベースには出力されません。 –

答えて

3

。この時点でCDBが存在しないという事実(バージョン11)が明らかになりました。

$IF DBMS_DB_VERSION.VER_LE_11 $THEN 
    -- version 11 code 
    NULL; 
$ELSE 
    -- version 12 and later code 
    NULL; 
$END 

条件付きコンパイルディレクティブは、プリプロセッサに似た行動:

これを回避するには、条件付きコンパイルを使用します。あなたは「それは私がDBホスト上でそれを実行したときに正常に動作」あなたはORACLE_SID(またはTWO_TASK)であると言うとき

は12cをDBに設定https://oracle-base.com/articles/10g/conditional-compilation-10gr2

+0

ありがとうございますが、バージョンはOracle用ではありませんが、関連性のない他の製品用です。 – Pha3drus

+0

@ Pha3drus - 12c固有のコード(つまり、CDBチェック)の周りに条件付きコンパイルを使用することもできます。あなたのコードでは、それはDBのバージョンに関連しているように見えます。 –

+0

@ Pha3drus - 例を拡張して明確にしたいですか? –

関連する問題