2014-06-18 68 views
0

我試圖創建布爾輸入參數的存儲過程: -的Oracle 11g - 傳遞布爾存儲過程

第1步:我創建了一個表像下面

CREATE TABLE STOREBOOL (BOOLVAL NUMBER(1)); 

步驟2:我創建了一個存儲過程

基於以下鏈接:http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/tips3.htm#1005343創建了一個程序

CREATE OR REPLACE PROCEDURE boolProc(x boolean) 
AS 
BEGIN 
    INSERT INTO storebool("boolval") VALUES(x); 
COMMIT; 
END; 

輸出是: -

Warning: Procedure created with compilation errors. 

類似地創建的第二個過程:

CREATE OR REPLACE PROCEDURE boolWrap(x int) 
AS 
BEGIN 
IF (x=1) THEN 
boolProc(TRUE); 
ELSE 
boolProc(FALSE); 
END IF; 
END; 

輸出是: -

Warning: Procedure created with compilation errors. 

步驟3:執行代碼

BEGIN 
boolWrap(1); 
END; 
/

它顯示了以下錯誤:

boolWrap(1); 
* 
ERROR at line 2: 
ORA-06550: line 2, column 1 
PLS-00905: object SCOTT.BOO 
ORA-06550: line 2, column 1 
PL/SQL: Statement ignored 

如何運行它是否正確?

回答

2

您是否注意到「創建編譯錯誤」消息?在看到show errors或通過查詢user_errors視圖後,您可以立即看到錯誤是什麼。

在第一個過程你這個洞:

INSERT INTO storebool("boolval") VALUES(x); 

...裏面有兩個問題:(1)你沒有一列名爲"boolval";它被創建爲沒有引用的BOOLVAL,所以或者引用它不加引號,或者用引號括起來,因爲它出現在數據字典中;和(b)您正嘗試將number列設置爲boolean值。 Oracle SQL沒有布爾類型,但沒有可用的隱式轉換。您需要定義什麼數字表示TRUE,以及表示FALSE,然後插入該數字而不是布爾值x參數。所以,你會看到這樣的錯誤:

4/46   PLS-00382: expression is of wrong type 
4/28   PL/SQL: ORA-00904: "boolval": invalid identifier 

boolWrap不能編譯,因爲boolProc無效。

你的boolProcboolWrap程序是真的逆轉;你希望'真正的'過程採用一個數字參數,並且包裝器採用一個布爾值並將其轉換爲一個數字來調用real

這可能更有意義:

CREATE TABLE STOREBOOL (BOOLVAL NUMBER(1), 
    CONSTRAINT BOOLCHECK CHECK (BOOLVAL IN (0,1)) 
); 

CREATE OR REPLACE PROCEDURE boolProc(p_bool_num number) 
AS 
BEGIN 
    INSERT INTO storebool(boolval) VALUES (p_bool_num); 
END; 
/

CREATE OR REPLACE PROCEDURE boolWrap(p_bool boolean) 
AS 
    l_bool_num number; 
BEGIN 
    IF p_bool THEN 
     boolProc(1); 
    ELSE 
     boolProc(0); 
    END IF; 
END; 
/

然後就可以調用boolProc與一些說法,或boolWrap用布爾的說法:

BEGIN 
    boolProc(1); 
END; 
/

BEGIN 
    boolWrap(false); 
END; 
/

select * from storebool; 

    BOOLVAL 
---------- 
     1 
     0 
+0

當從Java代碼中調用它。我做了以下事情: - 連接conn = DriverManager.getConnection(「jdbc:oracle:oci8:@」,「scott」,「tiger」); CallableStatement pstmt = conn.prepareCall(「begin boolWrap(?); end;」); pstmt.setBoolean(1,true); pstmt.execute();但它顯示錯誤6550ORA-06550:第1行,第7列: PLS-00306:調用'BOOLWRAP'時參數的錯誤數量或類型 ORA-06550:第1行,第7列: PL/SQL:語句被忽略 – sasi

+0

@sasi - [來自文檔](http://docs.oracle.com/cd/E18283_01/appdev.112/e13995/oracle/jdbc/OracleCallableStatement.html#setBoolean_java_lang_String__boolean_),它被轉換爲「BIT」類型。 [也看到這個](http://docs.oracle.com/cd/E11882_01/java.112/e16548/apxtblsh.htm#JJDBC28981):「JDBC驅動程序不支持將BOOLEAN參數傳遞給存儲的PL/SQL程序」。你需要用'setInt'來調用'boolProc'。但是......我從名字猜測這是你開始的地方? –

+0

我的要求是從java傳遞布爾值。所以我使用boolWrap。有沒有辦法從java傳遞布爾值。 – sasi