search
HomeDatabaseMysql Tutorial动态RefCursor的定义与调用
动态RefCursor的定义与调用Jun 07, 2016 pm 04:06 PM
reftypedynamicdefinitiontransfer

1.定义: type ref_cur is ref cursor; 2.动态cursor作为out参数 存储过程的实现 举个最简单的例子,根据table name动态获取cursor PROCEDURE P_GET_CUR(I_TABLE_NAME IN VARCHAR2, O_REF_CUR OUT REF_CUR) AS BEGIN IF UPPER(I_TABLE_NAME) = 'T_BANK_ACCOU

1.定义:

type ref_cur is ref cursor;

2.动态cursor作为out参数 存储过程的实现

举个最简单的例子,根据table name动态获取cursor

PROCEDURE P_GET_CUR(I_TABLE_NAME IN VARCHAR2, O_REF_CUR OUT REF_CUR) AS
BEGIN
IF UPPER(I_TABLE_NAME) = 'T_BANK_ACCOUNT' THEN
OPEN O_REF_CUR FOR
SELECT BANK_ACCOUNT
FROM T_BANK_ACCOUNT
WHERE BANK_ACCOUNT IS NOT NULL;

ELSIF UPPER(I_TABLE_NAME) = 'T_FB_PAYMENT_JP' THEN
OPEN O_REF_CUR FOR
SELECT BANK_ACCOUNT
FROM T_FB_PAYMENT_JP
WHERE BANK_ACCOUNT IS NOT NULL;

END IF;

END P_GET_CUR;

3.调用,用项目中mask 口座番号的功能为例,跟大家分享下:

procedure p_bank_acco_mask(i_table_name in varchar2,
i_coulumn in varchar,
o_error_str in out varchar2,
o_result in out number,
m_has_exception in out boolean) as

v_update_sql varchar(800);
v_update_sql2 varchar(800);
i int := 1;
v_bank_account VARCHAR2(50);
v_bank_account_new VARCHAR2(50);
v_char VARCHAR(1);
v_bank_account_curs ref_cur;
v_select_sql VARCHAR2(800);
begin

o_result := PKG_LS_PUB_CODE_CST.BATCH_RESULT__SUCCESS;

BEGIN
p_get_cur(i_table_name,v_bank_account_curs);
savepoint point;
v_update_sql2 := '';
LOOP
FETCH v_bank_account_curs INTO v_bank_account;

EXIT WHEN v_bank_account_curs%NOTFOUND;
BEGIN
for i in 1 .. length(v_bank_account) LOOP
v_select_sql:='SELECT SUBSTR('||i_coulumn||','||i||',1) from '|| i_table_name ||' where '||i_coulumn||'='''||v_bank_account||''' and rownum v_char:=f_get_char(v_select_sql);
IF v_char IS NULL THEN
RETURN;
END IF;
IF v_char='2' OR v_char='3' THEN--1
v_char:='1';
ELSIF v_char='5' OR v_char='6' THEN--4
v_char:='4';
ELSIF v_char='8' OR v_char='9' THEN--7
v_char:='7';
END IF;
v_bank_account_new:=v_bank_account_new||v_char;
END LOOP;
--should support bank_code='9900'
if i_table_name = 'T_DT_ACCOUNT_JP' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( Head_Bank_Code ' || ',' ||
'''9900''' || ',' || '''12340-01111281''' || ',' ||
v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_CASH_BANK' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( CASH_BANK ' || ',' ||
'''9900''' || ',' || '''12340-01111281''' || ',' ||
v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_CASH_BANK_LOG' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( CASH_BANK ' || ',' ||
'''9900''' || ',' || '''12340-01111281''' || ',' ||
v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_AGM_AGENT' then
v_update_sql := ' update ' || i_table_name ||
' set COMM_ACCOUNT = ' || v_bank_account_new ||'' ||
' where COMM_PAY_BANK_CODE ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set COMM_PAY_BRANCH_CODE =''12340'', ' ||
' COMM_ACCOUNT = ''01111281'' ' ||
' where COMM_PAY_BANK_CODE = ''9900''';
elsif i_table_name = 'T_SHOSHIHARAIRIREKIJOUHOU_TBL' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( substr(BANK_ACCOUNT_NO,2,4) ' ||
',' || '''9900''' || ',' || '''12340-01111281''' ||
',' || v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_NYUSHUTUKINRIREKIJOUHOU' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( substr(KOUZA_NO,2,4) ' ||
',' || '''9900''' || ',' || '''12340-01111281''' ||
',' || v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_ACCOUNT_APPLY_TBL' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( substr(ACCOUNT_NO,1,4) ' ||
',' || '''9900''' || ',' || '''12340-01111281''' ||
',' || v_bank_account_new ||' ) where' || i_coulumn ||'='''|| v_bank_account||'''';
elsif i_table_name = 'T_LSIF_OTHERS' then
v_update_sql := ' update ' || i_table_name || ' set KOUZAINO = ' ||
v_bank_account_new ||'' || ' where BANKCN ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set SITENCNJYO =''123'', ' ||
' SITENCNKA = ''40'', ' ||
' KOUZAINO = ''01111281'' ' ||
' where BANKCN = ''9900''';
elsif i_table_name = 'T_LSIF_GETUMATU_NENMATU_MASTER' then
v_update_sql := ' update ' || i_table_name || ' set KOUZAINO = ' ||
v_bank_account_new ||'' || ' where BANKCN ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set SITENCN =''12340'', ' ||
' KOUZAINO = ''01111281'' ' ||
' where BANKCN = ''9900''';
elsif i_table_name = 'T_LSIF_KAIKEI' then
v_update_sql := ' update ' || i_table_name || ' set WUZANO = ' ||
v_bank_account_new ||'' ||
' where GANKOWUMEYISHOUWUCN ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set SHITEYINMEYISYOUWUCN =''123'', ' ||
' WUZANO = ''01111281'' ' ||
' where GANKOWUMEYISHOUWUCN = ''9900''';
elsif i_table_name = 'T_LSIF_IDOUEXTR' and i_coulumn = 'KOUZAINO_ZEN' then
v_update_sql := ' update ' || i_table_name ||
' set KOUZAINO_ZEN = ' || v_bank_account_new ||'' ||
' where GINKOUCN_ZEN ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set SHITENCNE_ZEN =''123'', ' ||
' SHITENCNGE_ZEN = ''40'', ' ||
' KOUZAINO_ZEN = ''01111281'' ' ||
' where GINKOUCN_ZEN = ''9900''';
elsif i_table_name = 'T_LSIF_IDOUEXTR' and i_coulumn = 'KOUZAINO_GO' then
v_update_sql := ' update ' || i_table_name || ' set KOUZAINO_GO = ' ||
v_bank_account_new ||'' ||
' where GINKOUCN_GO ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set SHITENCNE_GO =''123'', ' ||
' SHITENCNGE_GO = ''40'', ' ||
' KOUZAINO_GO = ''01111281'' ' ||
' where GINKOUCN_GO = ''9900''';
elsif i_table_name = 'T_DIAGNOSIS_CHARGE_DATA' then
v_update_sql := ' update ' || i_table_name || ' set ACCOUNT_NO = ' ||
v_bank_account_new ||'' || ' where BANK_CN ''9900'' and '|| i_coulumn ||'='''|| v_bank_account||'''';
v_update_sql2 := ' update ' || i_table_name ||
' set BRANCH_CN =''123'', ' ||
' ACCOUNT_NO = ''01111281'' ' ||
' where BANK_CN = ''9900''';
elsif i_table_name = 'T_IFE_MONTHLY_GETUMATU_MASTER' then
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( BANKCN ' || ',' ||
'''9900''' || ',' || '''12340-01111281''' || ',' ||
v_bank_account_new ||' ) where '|| i_coulumn ||'='''|| v_bank_account||'''';
else
v_update_sql := ' update ' || i_table_name || ' set ' || i_coulumn ||
' = decode( bank_code ' || ',' ||
'''9900''' || ',' || '''12340-01111281''' || ',' ||
v_bank_account_new ||' ) where '|| i_coulumn ||'='''|| v_bank_account||'''';
end if;
v_bank_account_new:='';--clear data
execute immediate v_update_sql;
if v_update_sql2 is not null then
execute immediate v_update_sql2;
end if;
pkg_pub_scd_ci.p_batch_commit();
EXCEPTION
when others then
rollback to point;
o_result := PKG_LS_PUB_CODE_CST.BATCH_RESULT__FAIL;
o_error_str := i_table_name || ',';
pkg_pub_scd_ci.p_log_error('p_bank_acco_mask ,failed to mask table:' ||
i_table_name || ',error info:' ||
sqlerrm || '-------update SQL=' ||
v_update_sql);
m_has_exception := true;
end;
END LOOP;
CLOSE v_bank_account_curs;
END;
end p_bank_acco_mask;

动态创建cursor的函数原理同上,其他带参数的cursor具体可以参考下面的:

--procedure返回记录集:
----------------------声明一个Package--------------
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPEmyrctypeIS REF CURSOR;

PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype); --Package中声明名为get 的Procedure(只有接口没内容)
END pkg_test;

-----------------声明Package Body,即上面Package中的内容,包括Procedure get---------------------
CREATE OR REPLACE PACKAGE BODY pkg_test
AS
PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype)
IS
sqlstr VARCHAR2 (500);
BEGIN
IF p_id = 0 THEN
OPEN p_rc FOR
SELECT ID, NAME, sex, address, postcode, birthday
FROM student;
ELSE
sqlstr :=
'select id,name,sex,address,postcode,birthday
from student where id=:w_id'; --w_id是个参数,
--以下 p_rc是个REF CURSOR游标类型,而且是OUT型参数,即可返回一个记录集了。USING p_id就是替换上面SQL中:w_id值拉:)
OPEN p_rc FOR sqlstr USING p_id; 
END IF;
END get;
END pkg_test;

--function返回记录集的例子,原理和上面相同,而是用function的return值来返回记录集。

函数返回记录集:
建立带ref cursor定义的包和包体及函数:
复制代码 代码如下:
CREATE OR REPLACE
package pkg_test as

type myrctype is ref cursor;
function get_r(intID number) return myrctype;
end pkg_test;
/
CREATE OR REPLACE
package body pkg_test as
--函数体
function get_r(intID number) return myrctype is
rc myrctype; --定义ref cursor变量
sqlstr varchar2(500);
begin
if intID=0 then

--静态测试,直接用select语句直接返回结果
open rc for select id,name,sex,address,postcode,birthday from student;
else
--动态sql赋值,用:w_id来申明该变量从外部获得
sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id';
--动态测试,用sqlstr字符串返回结果,用using关键词传递参数
open rc for sqlstr using intid;
end if;
return rc;
end get;
end pkg_test;

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
修复:Windows 11 的动态刷新率不起作用修复:Windows 11 的动态刷新率不起作用Apr 13, 2023 pm 08:52 PM

您可以通过计算图像每秒更新的次数来衡量屏幕的刷新率。DRR 是 Windows 11 中包含的一项新功能,可帮助您节省电池寿命,同时仍提供更流畅的显示,但当它无法正常工作时也就不足为奇了。随着越来越多的制造商宣布计划停止生产 60Hz 显示器,具有更高刷新率的屏幕预计将变得更加普遍。这将导致更流畅的滚动和更好的游戏,但它会以减少电池寿命为代价。但是,此 OS 迭代中的动态刷新率功能是一个漂亮的附加功能,可以对您的整体体验产生重大影响。继续阅读,我们将讨论如果 Windows 11 的动态刷新率未

如何在 iPhone 屏幕录制中隐藏动态岛和红色指示器如何在 iPhone 屏幕录制中隐藏动态岛和红色指示器Apr 13, 2023 am 09:13 AM

在iPhone上,Apple 的屏幕录制功能会录制您在屏幕上所做的事情的视频,如果您想捕捉游戏玩法、引导他人完成应用程序中的教程、演示错误或其他任何事情,这非常有用。在显示屏顶部有凹口的旧款 iPhone 上,该凹口在屏幕录制中不可见,这是应该的。但在带有 ‌Dynamic Island‌ 切口的较新 iPhone 上,例如 ‌iPhone 14 Pro‌ 和 ‌iPhone 14 Pro‌ Max,‌Dynamic Island‌ 动画显示红色录制指示器,这导致切口在捕获的视频中可见。这可能会

将VirtualBox固定磁盘转换为动态磁盘,反之亦然将VirtualBox固定磁盘转换为动态磁盘,反之亦然Mar 25, 2024 am 09:36 AM

在创建虚拟机时,系统会要求您选择磁盘类型,您可以选择固定磁盘或动态磁盘。如果您选择了固定磁盘,后来意识到需要动态磁盘,或者相反,该怎么办?好!你可以把一种转换成另一种。在这篇文章中,我们将看到如何将VirtualBox固定磁盘转换为动态磁盘,反之亦然。动态磁盘是一种虚拟硬盘,它最初具有较小的大小,随着您在虚拟机中存储数据,其大小会相应增长。动态磁盘在节省存储空间方面非常高效,因为它们只占用所需的主机存储空间。然而,随着磁盘容量的扩展,可能会稍微影响计算机的性能。固定磁盘和动态磁盘是虚拟机中常用的

如何在 Windows 11 上将动态磁盘转换为基本磁盘如何在 Windows 11 上将动态磁盘转换为基本磁盘Sep 23, 2023 pm 11:33 PM

如果要在Windows11中将动态磁盘转换为基本磁盘,则应首先创建备份,因为该过程将擦除其中的所有数据。为什么要在Windows11中将动态磁盘转换为基本磁盘?根据Microsoft,动态磁盘已从Windows中弃用,不再推荐使用。此外,Windows家庭版不支持动态磁盘,因此您将无法访问这些逻辑驱动器。如果要将更多磁盘合并到更大的卷中,建议使用基本磁盘或存储空间。在本文中,我们将向您展示如何在Windows11上将动态磁盘转换为基本磁盘如何在Windows11中将动态磁盘转换为基本磁盘?在开始

Windows 10和11如何禁止文件夹和文件的动态显示以阻止快速访问?Windows 10和11如何禁止文件夹和文件的动态显示以阻止快速访问?May 06, 2023 pm 04:58 PM

微软在Windows10中引入了快速访问,并在最近发布的Windows11操作系统中保留了该功能。快速访问取代了文件资源管理器中的收藏夹系统。这两个功能之间的核心区别之一是快速访问在其列表中添加了一个动态组件。一些文件夹永久显示,而其他文件夹则根据使用情况显示。固定文件夹显示有一个大头针图标,动态文件夹没有这样的图标。您可以在此处查看我的收藏夹和快速访问之间的比较,了解更多详细信息。快速访问比收藏夹更强大,但动态文件夹列表为其添加了混乱元素。可能会显示无用或不应在文件资源管理器中突出显示的文件

如何在 Windows 11 的桌面和开始菜单上获取动态磁贴如何在 Windows 11 的桌面和开始菜单上获取动态磁贴Apr 14, 2023 pm 05:07 PM

想象一下,您正在系统上寻找某些东西,但不确定要打开或选择哪个应用程序。这就是动态磁贴功能发挥作用的地方。任何支持的应用程序的动态磁贴都可以添加到桌面或Windows系统的开始菜单上,其磁贴经常变化。LiveTiles使应用程序小部件变得活跃起来,非常令人愉悦。不仅是为了它的外观,甚至是为了方便。假设您在系统上使用whatsapp或facebook应用程序,如果在应用程序图标上显示通知数量不是很方便吗?如果将任何此类受支持的应用程序添加为动态磁贴,则这是可能的。让我们看看如何在Windows

如何在 Windows 11 上使用动态锁定如何在 Windows 11 上使用动态锁定Apr 13, 2023 pm 08:31 PM

什么是 Windows 11 上的动态锁定?动态锁定是 Windows 11 的一项功能,可在连接的蓝牙设备(您的手机或可穿戴设备)超出范围时锁定您的计算机。即使您在离开时忘记使用 Windows 键 + L 快捷键,动态锁定功能也会自动锁定您的 PC。Dynamic Lock 使用任何带有蓝牙的连接设备,但最好使用电池电量和续航里程充足的设备,例如您的手机。一旦您的设备在 30 秒内无法触及,Windows 将自动锁定屏幕。将蓝牙设备与 Windows 11 配对要让一切正常运行,您需要先将

如何使用HTML、CSS和jQuery制作一个动态的图片轮播如何使用HTML、CSS和jQuery制作一个动态的图片轮播Oct 25, 2023 am 10:09 AM

如何使用HTML、CSS和jQuery制作一个动态的图片轮播在网站设计和开发中,图片轮播是一个经常使用的功能,用于展示多张图片或广告横幅。通过HTML、CSS和jQuery的结合,我们可以实现一个动态的图片轮播效果,为网站增加活力和吸引力。本文将介绍如何使用HTML、CSS和jQuery制作一个简单的动态图片轮播,并提供具体的代码示例。第一步:设置HTML结

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment