使用包从Oracle表中查询多行

rs.*_*rs. 0 sql oracle plsql stored-procedures oracle10g

我写了一个包来查询表中的行.此选择查询将调用其他函数并返回表中的所有行.但是当我编写一个包含所有函数和sprocs的包时,我的带有select语句的sproc给了我一个错误,说我不能在没有语句的情况下执行.但如果我使用它然后它将只返回一行.如何使用oracle sp检索所有行?

    Procedure GetData As 
BEGIN 
Select Jobid, JobName, JobLocation, JobCompany, X(jobid) FROM jobsTable; END GetData; 
END; 
Run Code Online (Sandbox Code Playgroud)

我不得不改变它以使错误消失:

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;
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 5

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

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;
Run Code Online (Sandbox Code Playgroud)

我同意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;
Run Code Online (Sandbox Code Playgroud)

你知道吗:

Procedure GetData As 
  r_Jobid jobsTable.jobid%type; 
  r_JobName jobsTable.jobName%type; 
  r_JobLocation jobsTable.jobLocation%type; 
  r_temp varhar2(10); 
Run Code Online (Sandbox Code Playgroud)

...意味着您定义了局部变量?您将无法从该过程中获取信息.如果你这样做,你需要参数,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我使用IO_来记录哪些参数是IN/OUT.我会在适用的地方使用IN_或OUT_.但是这里的关键是如果你想要一个参数退出来定义OUT.

此外 - 包只是程序和函数的逻辑分组,能够定义作用于包的常量.包本身不执行任何SQL - 它仍然是正在执行的函数或过程.上帝,我希望SQL Server有包...