oracle - Oracle 从游标中读取并返回数据
问题描述
我正在尝试在 Oracle 中创建一个存储过程,该过程具有一个输入参数和一个输出变量,如果有结果,则将数据集返回到我的 .Net 应用程序。主要问题是我无法更改程序的签名,需要执行 if 条件来验证是否存在记录。我一直在努力的主要问题是游标(执行和返回信息),并计算选择的结果。
这是我正在尝试检索数据的示例。
CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID NUMBER(1))
AS
TYPE v_record_botoes IS RECORD (
v_dummy_col1 VARCHAR2(50),
v_dummy_col2 VARCHAR2(250)
);
TYPE table_botoes IS TABLE OF v_record_botoes;
tt_botoes table_botoes;
v_ref_cursor SYS_REFCURSOR;
CURSOR v_cursor IS
(SELECT dt.v_dummy_col1,
dt.v_dummy_col2
FROM dummy_table dt
WHERE v_dummy_col3 = v_input);
v_check NUMBER;
BEGIN
tt_botoes := table_botoes();
v_check := 0;
FOR v_row IN v_cursor
LOOP
tt_botoes.extend;
tt_botoes(tt_botoes.COUNT) := v_row;
END LOOP;
v_check := tt_botoes.COUNT;
-- condition that need to know the nr of records of the select
IF v_check = 0 THEN
v_OutID := 0;
ELSE
v_OutID := 1;
OPEN v_ref_cursor FOR
SELECT *
FROM tt_botoes; -- also tryed "FROM TABLE (tt_botoes)" and "FROM TABLE (cast(tt_botoes AS table_botoes))"
-- return dataset to .net application
DBMS_SQL.RETURN_RESULT(v_ref_cursor)
END IF;
END;
已经尝试将v_cursor转换为sys_refcursor以由DBMS_SQL 包输出,但没有得到任何结果。我还尝试创建一个临时表来保存信息,但随后出现了并发问题。
知道我做错了什么,或者任何其他可能的解决方案来解决这个问题?
提前致谢
解决方案
完全未经测试,因为我没有测试它的环境,但我会以完全不同的方式构建它,见下文(我假设规范中的遗漏只是一个错字)
CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID **out** NUMBER(1))
AS
v_ref_cursor SYS_REFCURSOR;
v_check NUMBER;
BEGIN
select count(1)
into v_check
from dummy_table dt
WHERE v_dummy_col3 = v_input
-- condition that need to know the nr of records of the select
IF v_check = 0 THEN
v_OutID := 0;
ELSE
v_OutID := 1;
OPEN v_ref_cursor FOR
SELECT dt.v_dummy_col1,
dt.v_dummy_col2
FROM dummy_table dt
WHERE v_dummy_col3 = v_input
-- return dataset to .net application
DBMS_SQL.RETURN_RESULT(v_ref_cursor)
END IF;
END;
推荐阅读
- javascript - JSON 数据仅填充 DataTable 中的第一个字母
- serverless-framework - 我怎样才能看到无服务器部署正在使用哪些对象?
- django - Docker-Kubernets 找不到 manage.py
- nginx - NGINX + CentOS 8 mydomain.com 显示 NGINX 欢迎页面,而 mydomain.com/index.html 显示网站索引页面
- html - 使用元素而不是获取可点击的行
- reactjs - 反应隐藏某些路由的标题组件
- reactjs - Graphql 订阅或 pollInterval ?不同情况下的区别?
- selenium - Selenium 自动化 - 从一个公共文件夹运行
- javascript - clustergrammer 在 Electron 应用程序中不起作用
- java - 要求用户输入 10 个字符,然后按字符之间的破折号排序的程序