[英]Oracle SQL : Querying data using Table Function passing rows from another table
[英]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.