PL/SQL API调用/查询返回多条记录,如何传入多个变量
Posted
技术标签:
【中文标题】PL/SQL API调用/查询返回多条记录,如何传入多个变量【英文标题】:PL/SQL API call/query returns multiple records, how to pass into multiple variables 【发布时间】:2021-11-12 15:20:21 【问题描述】:我在 oracle sql 中有这样的 api_call:
select sb_transfer_crse.f_query_all('000497') from dual;
响应如下所示:
SHBTATC_SBGI_CODE SHBTATC_PROGRAM SHBTATC_TLVL_CODE SHBTATC_SUBJ_CODE_TRNS SHBTATC_CRSE_NUMB_TRNS SHBTATC_TRNS_TITLE
------ ------------ -- ---------------------------------------------------------------------------------
000497 ...... UG AAA 010 Acad Achievement Pre-College
000497 ...... UG AAA 050 Semester Survival
000497 ...... UG AAA 070 Special Topics
000497 ...... UG AAA 071 Special Topics
000497 ...... UG AAA 072 Special Topics
000497 ...... UG AAA 073 Special Topics
我正在尝试将响应数据传递到变量中,以便在循环中一次处理一个,或者如果可能的话将它们全部导出到临时/新表中
我目前的样子是这样的:
Declare
--variables for query
VAR_p_sbgi_code shbtatc.shbtatc_sbgi_code%TYPE;
--Variables for Data being returned
VAR_r_sbgi_code shbtatc.shbtatc_sbgi_code%TYPE;
VAR_r_program shbtatc.shbtatc_program%TYPE;
VAR_r_tlvl_code shbtatc.shbtatc_tlvl_code%TYPE;
VAR_r_subj_code_trns shbtatc.shbtatc_subj_code_trns%TYPE;
VAR_r_crse_numb_trns shbtatc.shbtatc_crse_numb_trns%TYPE;
VAR_r_trns_title shbtatc.shbtatc_trns_title%TYPE;
Begin
select sb_transfer_crse.f_query_all(p_sbgi_code => VAR_p_sbgi_code)
INTO VAR_r_sbgi_code,VAR_r_program,VAR_r_tlvl_code,VAR_r_subj_code_trns,VAR_r_crse_numb_trns,VAR_r_trns_title
From Dual;
End;
问题是我习惯于处理获得一个结果/响应,而不是 6 个。我不确定如何遍历结果?
任何帮助将不胜感激。
这是函数:
Function f_query_all(p_sbgi_code shbtatc.shbtatc_sbgi_code%TYPE,
p_program shbtatc.shbtatc_program%TYPE DEFAULT NULL)
RETURN transfer_crse_ref
这就是 transfer_crse_ref 的含义:
transfer_crse_ref
TYPE transfer_crse_ref IS REF CURSOR RETURN transfer_crse_rec;
Entity cursor variable type
这就是 transfer_crse_rec 的样子:
transfer_crse_rec
TYPE transfer_crse_rec IS RECORD (
r_sbgi_code shbtatc.shbtatc_sbgi_code%TYPE,
r_program shbtatc.shbtatc_program%TYPE,
r_tlvl_code shbtatc.shbtatc_tlvl_code%TYPE,
r_subj_code_trns shbtatc.shbtatc_subj_code_trns%TYPE,
r_crse_numb_trns shbtatc.shbtatc_crse_numb_trns%TYPE,
r_term_code_eff_trns shbtatc.shbtatc_term_code_eff_trns%TYPE,
r_trns_title shbtatc.shbtatc_trns_title%TYPE,
r_trns_low_hrs shbtatc.shbtatc_trns_low_hrs%TYPE,
r_trns_high_hrs shbtatc.shbtatc_trns_high_hrs%TYPE,
r_trns_review_ind shbtatc.shbtatc_trns_review_ind%TYPE,
r_tast_code shbtatc.shbtatc_tast_code%TYPE,
r_trns_catalog shbtatc.shbtatc_trns_catalog%TYPE,
r_tgrd_code_min shbtatc.shbtatc_tgrd_code_min%TYPE,
r_group shbtatc.shbtatc_group%TYPE,
r_group_primary_ind shbtatc.shbtatc_group_primary_ind%TYPE,
r_protect_ind shbtatc.shbtatc_protect_ind%TYPE,
r_crse_desc shbtatc.shbtatc_crse_desc%TYPE,
r_user_id shbtatc.shbtatc_user_id%TYPE,
r_data_origin shbtatc.shbtatc_data_origin%TYPE,
r_internal_record_id gb_common.internal_record_id_type);
Business Entity record type
【问题讨论】:
使用 FOR-LOOP 游标遍历数据集 可以发f_query_all
的声明吗?对dual
的查询将返回多行是没有意义的。我的猜测是 f_query_all
正在返回 sys_refcursor
或集合,并且在您显示的查询和您显示的结果之间缺少步骤,而其他应用程序正在格式化结果。
@JustinCave 添加了请求的信息,我认为
@alvalongo 这是我从表中提取数据时通常会做的事情,但我不知道这是否适用于这样的 api 调用?
@JustinCave 我明白你的意思,它看起来确实将结果返回到带有 transfer_crse_ref 片段的游标中
【参考方案1】:
好的,在@justinCave 的帮助下,当他们提到 ref_cursor 时,我能够找到一个解决方案,以一种可以将数据获取到变量的方式为我提供结果:
declare
symbol_cursor BANINST1.sb_transfer_crse.transfer_crse_ref;
symbol_record BANINST1.sb_transfer_crse.transfer_crse_rec;
begin
symbol_cursor := sb_transfer_crse.f_query_all(p_sbgi_code => '000497');
loop
fetch symbol_cursor into symbol_record;
exit when symbol_cursor%notfound;
-- Do something with each record here, e.g.:
dbms_output.put_line(symbol_record.r_sbgi_code|| ',' ||symbol_record.r_program|| ',' ||symbol_record.r_tlvl_code|| ',' ||symbol_record.r_subj_code_trns|| ',' ||symbol_record.r_crse_numb_trns|| ',' ||symbol_record.r_term_code_eff_trns|| ',' ||symbol_record.r_trns_title|| ',' ||symbol_record.r_trns_low_hrs|| ',' ||symbol_record.r_trns_high_hrs|| ',' ||symbol_record.r_trns_review_ind|| ',' ||symbol_record.r_tast_code|| ',' ||symbol_record.r_trns_catalog|| ',' ||symbol_record.r_tgrd_code_min|| ',' ||symbol_record.r_group|| ',' ||symbol_record.r_group_primary_ind|| ',' ||symbol_record.r_protect_ind|| ',' ||symbol_record.r_crse_desc|| ',' ||symbol_record.r_user_id|| ',' ||symbol_record.r_data_origin|| ',' ||symbol_record.r_internal_record_id);
end loop;
CLOSE symbol_cursor;
end;
【讨论】:
以上是关于PL/SQL API调用/查询返回多条记录,如何传入多个变量的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pl/sql 块插入多条记录?我在这段代码中收到错误消息
PL/SQL-表和条件都不同时如何在单个查询中实现多条count语句