2011-11-09 43 views
2

からPL/SQLを実行しようとしていますが、これはユーザー・エラーです。ORA-00922:欠落しているか無効なオプションです。C#

私は、OracleデータベースへのC#を結ぶに新しいですし、私のPL/SQLは、Oracle SQL Developer内から作品Oracle online documentation

で、その後私のコードをモデル化しました。私は私のTest.aspxというページに取得していますエラーは次のとおりです。

ORA-00922: missing or invalid option

test.aspx.csページ内の背後にあるコードは次のとおりです。

string currentTerm = getCurrentTerm(); 
    string passwd = "<get password input>"; 
    string salt = "<get salted input>"; 

    conn.ConnectionString = ConfigurationManager.ConnectionStrings["CONNECTIONSTRINGNAME"].ConnectionString; 

     conn.Open(); 

     // pl/sql block 
     string pl_sql = " set serveroutput on " + 
            "DECLARE"+ 
            " output     tablename.function%TYPE;" + 
            "BEGIN"+ 
            " tablename.myfunction(:1,:2,:3);" + 
            " dbms_output.put_line('output= '||output"+ 
            "END;"; 

     //Oracle Parameters necessary for the myfunction function 
     OracleParameter p_1 = new OracleParameter(passwd, OracleDbType.Varchar2, 50, ParameterDirection.Input); 
     OracleParameter p_2 = new OracleParameter(salt, OracleDbType.Varchar2, 50, ParameterDirection.Input); 
     OracleParameter p_3 = new OracleParameter("3", OracleDbType.Varchar2, 50, ParameterDirection.Output); 

     // create the command object 
     OracleCommand cmd = conn.CreateCommand(); 
     cmd.CommandText = pl_sql; 

     // add the parameters 
     cmd.Parameters.Add(p_1); 
     cmd.Parameters.Add(p_2); 
     cmd.Parameters.Add(p_3); 

     // execute the pl/sql block 
     cmd.ExecuteNonQuery(); 

     // get a data reader from the ref cursor 
     // note: this is on p_3, the output value 
     OracleDataReader dr = ((OracleRefCursor)p_3.Value).GetDataReader(); 

     while (dr.Read()) 
     { 

      Response.Write("Salt licked hash: "+ dr[0].ToString()); 
      //Output the line retrieved from dbms_output.put line 
      Response.Write("<br />"); 
      Response.Write("DBMS_OUTPUT STATUS: "+ p_3.Value.ToString()); 

     } 

答えて

7

1)SET SERVEROUTPUT ONは、SQL Plusは、それがSQLやPL/SQL言語(の一部ではないfunction--あるSQL DeveloperおよびヒキガエルのようなのGUIの多くは、このような少なくともいくつかのSQLのサポートプラスの機能を持っているが) 。

2)ほとんどの場合、アプリケーションと関係があることはほとんどありません。これは、PL/SQLブロックからデータを取得する正しい方法ではありません。技術的には、DBMS_OUTPUT.ENABLE(<<buffer size>>)をPL/SQLブロックにコールし、DBMS_OUTPUT.PUT_LINEを使用してバッファにデータを書き込んだ後、アプリケーションでDBMS_OUTPUT.GET_LINEを呼び出して、プロシージャの完了後にバッファからデータを読み取らせることができます。これが、SQL * PlusとSQL Developerがカバーしていることです。しかし、それはアプリケーションを構築する適切な方法ではありません。

3)私はどのタイプのtablename.myfunctionが返ってくるのか分かりません。単純なスカラーまたはREF CURSORを返す場合は、PL/SQLの無名ブロックを使用せずに関数を呼び出すことができます。ハリソンはthis SO thread on calling a function that returns a REF CURSOR in C#でデモンストレーションします。 PL/SQLレコード・タイプを戻す場合、Mark WilliamsはOTNフォーラムでan anonymous PL/SQL block that returns a PL/SQL record in C#の例を持っています。

+0

tablename.myfunction returns Varchar2提案された変更を行い、新しいエラーが発生しました...私はそれが良いと思います。 ORA-06502:PL/SQL:数値または値のエラー:文字列バッファが小さすぎますORA-06512: "REDACTED_TABLE"、行77 ORA-06512: "REDACTED_TABLE"、行130 ORA-06512:行1 – Geekender

+0

@ user834436 - 'REDACTED_TABLE'が関数名であると仮定すると、130行目と77行目は何ですか? –

+0

ああ、私はそれがテーブルではない関数だと思います。簡単な質問ですが、これが現在のアクセス許可の問題になりますか?もしそうなら、C#のコードではなく、SQL Developerで動作するのはなぜですか? – Geekender

1

私はあなたがこの文を閉じて表示されていないdbms_output.put_line('output= '||output"+

+0

良い点。それはそれを解決しませんでした。同じエラー。 Oracle SQL Developerで正常に完了しました – Geekender

関連する問題