2016-09-14 34 views
0

上記のコードでは、schemanameを入力として与えています。その入力を使用すると、データベースに接続する必要があります。しかし、この場合、私が入力した値はschemanameによって取られません。Variable-Oracleの使用

declare schemaname varchar2(20); 
exec :schemaname := XYZ; 
BEGIN 

end; 

Error report - 
ORA-06550: line 2, column 6: 
PLS-00103: Encountered the symbol "" when expecting one of the following: 

    constant exception <an identifier> 
    <a double-quoted delimited-identifier> table long double ref 
    char time timestamp interval date binary national character 
    nchar 
ORA-06550: line 4, column 1: 
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the following: 

いずれかが、それはdeclareendの間のコードは、PL/SQLでスプール

答えて

2

を使用して動作させる方法を提案でした:これは出してエラーがある方法です。 CONNECTまたはSPOOLのようなコマンドは、SQL * Plusコマンドです。 SQL * Plusコマンドは、PL/SQLブロックで使用できません。あなたがすべてでPL/SQLを必要としない、あなたの場合は

は、以下の内容

connect &1 
spool C:\ABC 
@c:\ABC 
spool off; 

でスクリプトを作成し、BTW

@your_script_name 

それを実行します:なしありあなたがスプールしている間にスクリプトc:\ ABCを実行する理由。正確に何を達成したいですか?

+0

:\ ABC.LST'接尾辞が与えられなかったよう。 '@'はデフォルトで 'C:\ ABC.SQL'になります。したがって、それらは同じファイルではありません。私は混乱を避けるために少なくともスプールの名前をいっぱいに見たいと思っています... –

1

exec[ute]はSQL * Plusであり、SQL Developer(およびおそらく他のクライアント)は無名ブロックの略です。 クライアントコマンドですが、PL/SQLの一部ではありません。 PL/SQL宣言セクション内で使用しようとしていますが、PL/SQL宣言セクションは有効ではありません。

クライアント・バインド変数を使用する場合は、あなたがvar[iable] commandを必要とする:

var schemaname varchar2(20); 
exec :schemaname := '&1'; 

BEGIN 
... 

お知らせ&1周りの単一引用符、それは文字列変数に代入されていて。

ただし、PL/SQLブロック内で接続することはできません。また、接続にバインド変数を使用することはできません。

connect :schemaname 

は(あなたはそれがuser/passwdとしての価値だ定義されていても)、パスワードの入力を要求し、lieterally :schemanameと呼ばれるユーザーとして接続しようとします。

置換変数を使用することはできますが、実際には新しい変数を定義する必要はありません。あなたが資格情報を渡しているように見えるよう、あなたが行うことができます:

(周囲の引用符なし)
connect &1 

スプールがC `がデフォルトになります