2013-09-24 32 views
0

我有这样一个PL/SQL语句(它不是一个存储过程或函数):PLSQL收益表中设置

DECLARE 
    curstatus VARCHAR(2); 
    person_id varchar(6) := 100; 
BEGIN 
    SELECT cur_status INTO curstatus FROM Persons WHERE PID=cast(person_id as number(6)); 
    IF curstatus='F' THEN 
    SELECT PID FROM Reports WHERE Report_Type='F' AND PID = person_id; 
    END IF; 
END; 

我想从报告(它们显示在屏幕上)返回所有PID,但是,我收到一个错误:an INTO clause is expected

请注意,这不是一个存储过程或函数。我怎样才能退回桌子?

+0

无法从匿名PL/SQL块返回结果集。 –

+1

为什么要在纯SQL中编写PL/SQL?然后你可以获得免费的返回位。 –

回答

4

当然纯粹的SQL解决方案,类似于以下,将工作?

SELECT r.PID 
    FROM Reports r, Persons p 
    WHERE r.Report_Type = 'F' AND r.PID = p.PID 
    AND p.cur_status = 'F' 
    AND p.PID = 100; 
+0

谢谢+1。这将工作,但它不会很好地集成到应用程序中。我很快就可以接受这个答案。 – w0051977

1

错误消息的原因是第二个select语句中没有into

DECLARE 
    curstatus VARCHAR(16); 
    person_id varchar(6) := 100; 
    p_pid VARCHAR(32); 
BEGIN 
    SELECT cur_status INTO curstatus FROM Persons WHERE PID=cast(person_id as number(6)); 
    IF curstatus='F' THEN 
    SELECT PID into p_pid FROM Reports WHERE Report_Type='F' AND PID = person_id; 
    END IF; 
END; 

您可以使用它返回sys_refcursor

例如函数

CREATE OR REPLACE FUNCTION testfunc 
    RETURN SYS_REFCURSOR 
AS 
    curstatus persons.cur_status%TYPE; 
    person_id VARCHAR (6) := 100; 
    r_cursor SYS_REFCURSOR; 
BEGIN 
    SELECT cur_status 
     INTO curstatus 
     FROM persons 
    WHERE pid = CAST (person_id AS NUMBER (6)); 

    IF curstatus = 'F' 
    THEN 
     OPEN r_cursor FOR 
      SELECT pid 
       INTO p_pid 
       FROM reports 
      WHERE report_type = 'F' AND pid = person_id; 
    END IF; 

    RETURN r_cursor; 
END; 
0

试试这个:

DECLARE 
    CURSTATUS VARCHAR (2); 
    PERSON_ID VARCHAR (6) := 100; 
    RESULTS REPORTS.PID%TYPE; 
BEGIN 
    SELECT 
      CUR_STATUS 
    INTO 
      CURSTATUS 
    FROM 
      PERSONS 
    WHERE 
      PID = CAST (PERSON_ID AS NUMBER (6)); 

    IF CURSTATUS = 'F' 
    THEN 
     SELECT 
       PID 
     INTO 
       RESULTS 
     FROM 
       REPORTS 
     WHERE 
       REPORT_TYPE = 'F' 
       AND PID = PERSON_ID; 
     DBMS_OUTPUT.PUT_LINE ('Result is:'||RESULTS); 
    END IF; 

END; 
0

您不能直接从PL/SQL块中调用查询,因为oracle对SQL和PL/SQL使用两个不同的引擎。

所有SQL查询都在SQL引擎中执行,所有PL/SQL操作都在PL/SQL引擎中处理。当你在PL/SQL块中运行查询时,数据集必须从sql传递到pl/sql引擎。而在PL/SQL引擎中,它需要作为变量或集合绑定到内存区域。对于这个绑定过程,我们需要INTO子句。一旦声明了变量并使用INTO子句绑定数据,PL/SQL引擎就可以使用这些数据。