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;

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

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

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

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

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

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

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

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


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境