2011-11-09 24 views
2

我幾乎肯定這是用戶錯誤。ORA-00922:缺少或無效的選項當試圖從C#執行PL/SQL

我是新來的C#連接到Oracle數據庫,並模仿我的代碼後,在Oracle online documentation

我的PL/SQL從Oracle SQL Developer中內工作。我在我的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 加function--它不是SQL或PL/SQL語言的一部分(雖然很多像SQL Developer和蟾蜍GUI的至少具有SQL一些支持加功能這樣) 。

2)你幾乎肯定不想使用DBMS_OUTPUT來處理任何與你的應用程序有關的事情 - 這不是從PL/SQL塊中獲取數據的正確方法。從技術上講,您可以在您的PL/SQL塊中調用DBMS_OUTPUT.ENABLE(<<buffer size>>),使用DBMS_OUTPUT.PUT_LINE將數據寫入緩衝區,然後讓應用程序調用DBMS_OUTPUT.GET_LINE在完成過程後從緩衝區讀取數據。這就是SQL * Plus和SQL Developer正在做的事情。但這不是構建應用程序的適當方式。

3)我不確定什麼類型tablename.myfunction正在返回。如果它返回一個簡單的標量或REF CURSOR,則生活變得更加簡單 - 您可以在沒有PL/SQL匿名塊的情況下調用該函數,如Harrison在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返回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

哦,我猜這是一個函數而不是表格。快速的問題,現在可以只是一個權限問題?如果是這樣,爲什麼它與SQL Developer而不是來自C#代碼? – Geekender

1

我沒有看到你關閉此聲明dbms_output.put_line('output= '||output"+

+0

好點。雖然這並沒有解決。同樣的錯誤。它在Oracle SQL Developer中成功完成 – Geekender