繁体   English   中英

使用包从Oracle表查询多行

[英]Querying multiple rows from Oracle table using package

我写了一个包来查询表中的行。 该选择查询将调用其他函数,并返回表中的所有行。 但是,当我编写一个包含所有函数和sproc的程序包时,我的带select语句的sproc给了我一个错误,说如果没有into语句,我将无法执行。 但是,如果我使用进然后它将只返回一行。 如何使用oracle sp检索所有行?

    Procedure GetData As 
BEGIN 
Select Jobid, JobName, JobLocation, JobCompany, X(jobid) FROM jobsTable; END GetData; 
END; 

我不得不将其更改为使错误消失:

Procedure GetData As 
  r_Jobid jobsTable.jobid%type; 
  r_JobName jobsTable.jobName%type; 
  r_JobLocation jobsTable.jobLocation%type; 
  r_temp varhar2(10); 
BEGIN

  Select Jobid, JobName, JobLocation, JobCompany, X(jobid) 
   INTO r_jobid, r_jobName, r_jobLocation, r_temp 
   FROM jobsTable; 

END GetData; 

END;

这是从函数返回多行的更好方法:

FUNCTION GET_DATA()
RETURN SYS_REFCURSOR IS

results_cursor SYS_REFCURSOR;

BEGIN

  OPEN results_cursor FOR
    SELECT t.jobid, 
           t.jobName, 
           t.joblocation, 
           t.jobcompany, 
           X(t.jobid) 
      FROM JOBSTABLE t; 

  RETURN results_cursor;

END;

我同意afk,尽管这似乎并不是您真正需要使用的。 这是我对使用游标的建议:

 CURSOR jobs IS
     SELECT t.jobid, 
            t.jobName, 
            t.joblocation, 
            t.jobcompany, 
            X(t.jobid) 
       FROM JOBSTABLE t; 

  v_row jobs%ROWTYPE; --has to be declared AFTER the cursor to be able to reference the row type

BEGIN

  OPEN jobs;
  FETCH jobs INTO v_row;

  IF jobs%FOUND THEN
    --do stuff here, per row basis
    --access columns in the row using: v_row.jobid/etc
  END IF;

  CLOSE jobs;

END;

您是否知道:

Procedure GetData As 
  r_Jobid jobsTable.jobid%type; 
  r_JobName jobsTable.jobName%type; 
  r_JobLocation jobsTable.jobLocation%type; 
  r_temp varhar2(10); 

...意味着您定义了局部变量? 您将无法从过程中获取信息。 如果这样做,则需要像这样的参数:

Procedure GetData(IO_R_JOBID IN OUT JOBSTABLE.JOBID%TYPE,
                  IO_R_JOBNAME IN OUT JOBSTABLE.JOBNAME%TYPE,
                  IO_R_JOBLOCATION IN OUT JOBSTABLE.JOBLOCATION%TYPE,
                  IO_R_TEMP IN OUT VARCHAR2(10)) AS

我使用IO_记录哪些参数是输入/输出。 如果适用,我会使用IN_或OUT_。 但是,这里的关键是如果您想取回参数,则要定义OUT。

另外-包只是过程和函数的逻辑分组,具有定义范围为包的常量的能力。 程序包本身不执行任何SQL-仍是正在执行的函数或过程。 天哪,我希望SQL Server有软件包...

您可以使用管道函数。 对于此示例,我仅获取ID列,但您只需要添加其他列即可。

CREATE PACKAGE jobsPkg AS
  TYPE jobsDataRec IS RECORD ( jobid jobsTable.jobid%type );
  TYPE jobsDataTab IS TABLE OF jobsDataRec;
  FUNCTION getJobsData RETURN jobsDataTab PIPELINED;
END jobsPkg;
/

CREATE PACKAGE BODY jobsPkg AS
  FUNCTION getJobsData RETURN jobsDataTab PIPELINED
  IS
    output_record  jobsDataRec;
  BEGIN
    FOR input_record IN ( SELECT jobid FROM jobsTable ) LOOP
      output_record.jobid := input_record.jobid;
      PIPE ROW (output_record);
    END LOOP;
  END getJobsData;
END jobsPkg;
/

然后可以将此函数用作行源:

SELECT * FROM TABLE( jobsPkg.getJobsData );

您需要将游标用于多个返回结果。 请阅读有关使用游标的本文,以了解更多详细信息。

您可以执行以下操作:

DECLARE
  CURSOR myCur IS 
        SELECT Jobid, JobName, JobLocation, JobCompany, X(jobid)
        FROM jobsTable;
BEGIN
  FOR resultRow in myCur
  LOOP
     --do your stuff here
  END LOOP;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM