2016-02-24 35 views
0

我目前正在研究兩個Java Web應用程序。一個使用PostgreSQL數據庫,另一個使用Oracle數據庫。 IDE是Intellij,OS是Windows。 使用Postgres應用程序,我們有很多存儲過程來返回數據庫實體,例如「顧客」。現在我正在嘗試在Oracle中做同樣的事情,但似乎Oracle中的過程並不相同。我甚至無法創建過程,Intellij在嘗試時總是給我幾條錯誤消息。 :-(也許有人可以舉例說明如何創建一個簡單的過程,該過程從一個表中返回一個db實體列表,具體取決於來自搜索掩碼的幾個參數,例如「name」,「last_name」,「email」 ?作爲搜索參數,這是偉大的!創建oracle程序返回db實體

+0

從這裏開始:https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm,並要求更多問題如果需要 –

+0

其實我已經做了,但仍然沒有線索如何實現我想要的... – Vortilion

+0

您正在尋找一個函數http://www.techonthenet.com/oracle/functions.php返回一個類型 –

回答

2
CREATE PROCEDURE get_Employees(
    in_first_name IN EMPLOYEES.FIRST_NAME%TYPE, 
    in_last_name IN EMPLOYEES.LAST_NAME%TYPE, 
    in_email  IN EMPLOYEES.EMAIL%TYPE, 
    out_cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN OUT_CURSOR FOR 
    SELECT * 
    FROM Employees 
    WHERE (in_last_name IS NULL OR last_name = in_last_name) 
    AND (in_first_name IS NULL OR first_name = in_first_name) 
    AND (in_email IS NULL OR email = in_email); 
END; 
/
SHOW ERRORS; 

測試

CREATE TABLE Employees (First_name, last_name, email) AS 
SELECT 'Alice', 'Abbots', '[email protected]' FROM DUAL UNION ALL 
SELECT 'Bob',  'Bucket', '[email protected]' FROM DUAL UNION ALL 
SELECT 'Charlie', 'Abbots', '[email protected]' FROM DUAL UNION ALL 
SELECT 'Denis', 'Dobbs', '[email protected]' FROM DUAL; 

運行:

VARIABLE cur REFCURSOR; 

BEGIN 
    get_Employees(
    in_first_name => 'Bob', 
    in_last_name => NULL, 
    in_email  => NULL, 
    out_cursor => :cur 
); 
END; 
/

PRINT cur; 

瓦ICH應該輸出:

anonymous block completed 
CUR 
--- 
FIRST_NAME LAST_NAME EMAIL   
---------- --------- ------------ 
Bob  Bucket [email protected] 

替代測試:

SET SERVEROUTPUT ON; 

DECLARE 
    cur SYS_REFCURSOR; 
    rec EMPLOYEES%ROWTYPE; 
BEGIN 
    get_Employees(
    in_first_name => 'Bob', 
    in_last_name => NULL, 
    in_email  => NULL, 
    out_cursor => cur 
); 

    LOOP 
    FETCH cur INTO rec; 
    EXIT WHEN cur%NOTFOUND; 

    DBMS_OUTPUT.PUT(rec.first_name); 
    DBMS_OUTPUT.PUT(' '); 
    DBMS_OUTPUT.PUT(rec.last_name); 
    DBMS_OUTPUT.PUT(' '); 
    DBMS_OUTPUT.PUT_LINE(rec.email); 
    END LOOP; 

    CLOSE cur; 
END; 
/
+0

不錯,可以通過在遊標中使用in參數作爲綁定變量來改善嗎? (注入機會少,性能更好) – kevinsky

+0

@kevinsky'IN'參數是綁定變量。在PL/SQL範圍中,你不需要在PL/SQL變量前添加':'作爲綁定變量(它們是自動的)。您只需要在SQL作用域中定義變量前綴。 – MT0

+0

謝謝!請問END之後爲什麼'/';? – Vortilion