2016-02-24 109 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