次のものを含む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;
/
を参照してください?その後、バナーには何が表示されますか? –
説明が追加されました。バージョンはOracleに関連していませんが、私が議論を通している他の製品です。 – Pha3drus
しかしデータベースのバージョンは重要です。これは12cデータベースではコンパイルされますが、11gデータベースには出力されません。 –