我在pl/sql块中写了一个光标.如果它有更多记录,这个块需要花费很多时间.如何在没有光标的情况下写这个或者是否有其他可以减少时间的替代方法?是否有任何替代查询来执行插入到一个表并使用单个查询从另一个表中删除?
DECLARE
MDLCursor SYS_REFCURSOR;
BEGIN
open MDLCursor for
select dc.dest_id, dc.digits, dc.Effectivedate, dc.expirydate
from DialCodes dc
INNER JOIN MDL d
ON dc.Dest_ID = d.Dest_ID
AND d.PriceEntity = 1
join sysmdl_calltypes s
on s.call_type_id = v_CallType_ID
and s.dest_id = dc.Dest_ID
and s.call_type_id not in
(select calltype_id from ignore_calltype_for_routing)
order by length(dc.digits) desc, dc.digits desc;
loop
fetch MDLCursor
into v_mdldest_id, v_mdldigits, v_mdlEffectiveDate, v_mdlExpDate;
insert into tt_pendingcost_temp
(Dest_ID,
Digits,
CCASDigits,
Destination,
tariff_id,
NewCost,
Effectivedate,
ExpiryDate,
previous,
Currency)
select v_mdldest_id,
Digits,
v_mdldigits,
Destination,
tariff_id, …Run Code Online (Sandbox Code Playgroud) select to_date(checks.payment_dte, 'YYYYMMDD') as payment_date,
checks.run_number,
checks.check_nbr as check_number,
checks.check_amt as check_amount,
checks.payee_no as payee_number,
checks.loc as location,
checks.fac_state as facility_state,
checks.delta_usa_ind,
checks.payee_lnme as payee_last_name,
checks.payee_fnme as payee_first_name,
checks.payee_addr1 as payee_address1,
checks.payee_addr2 as payee_address2,
checks.payee_addr3 as payee_address3,
checks.payee_city,
checks.payee_st as payee_state,
to_char(checks.payee_zip, '00000') as payee_zip,
to_char(checks.payee_zip4, '0000') as payee_zip4,
checks.payee_country_cde as payee_country_code,
country.country_abbreviation as payee_country_code_description,
checks.maint_code as maintenance_code,
checks.mod_dte as mod_date,
checks.mod_op,
checks.payment_profile_id,
checks.bank_profile_id,
checks.parent_id
from (select c.*,
check_total
from db1.tbl_payment_checks c
join (select sum(net) as check_total,
check_nbr
from (select …Run Code Online (Sandbox Code Playgroud) 我有一个A列,其中包含4个以'/'分隔的字段
example: 234-12-343/653423/MANAGER/yg@gmail.com
Run Code Online (Sandbox Code Playgroud)
想知道如何提取字段索引2?所以最终的输出将是653423.
(我的想法是使用正则表达式,但不知道如何做)
*数据库是Oracle 10g
我能够出来这些查询.谢谢您的帮助
select substr(ColumnA',
regexp_instr(ColumnA,'[\/]',1,1,0) + 1,
regexp_instr(ColumnA,'[\/]',1,2,0) - regexp_instr(ColumnA,1,1,0) - 1 )
as test from dual
Run Code Online (Sandbox Code Playgroud) create or replace
procedure prdBandwidth
is
cursor c_bandwidth is select distinct mt.name bwname,b.circuitno circuitno,subapp.customerno customerno,netinfo.bandwidthtype bandwidthtype from wom.tbltsubscriberapplication subapp,wom.tbltllnetworkinfo netinfo,wom.tblmmastertype mt,(select max(applicationdate) as maxdate,circuitno,customerno from wom.TBLTSUBSCRIBERAPPLICATION,tblmaccount where nodename='End' and accountnumber=customerno group by circuitno, customerno) b where subapp.applicationdate=b.maxdate and subapp.circuitno=b.circuitno and subapp.llnetworkinfoid=netinfo.id and netinfo.bandwidthtype=mt.id;
bwtype varchar2(6);
bwtypelen number;
bwtypesublen number;
bwvalue varchar2(8);
kbpsdata number;
begin
DBMS_OUTPUT.PUT_LINE('hhahahahah');
for crs_bandwidth in c_bandwidth
loop
bwtypelen:=length(crs_bandwidth.bwname);
DBMS_OUTPUT.PUT_LINE('bwtypelen:::'+bwtypelen);
bwtype:=substr(crs_bandwidth.bwname,-4,4);
DBMS_OUTPUT.PUT_LINE('bwtype:::'+bwtype);
bwtypesublen:=length(bwtype);
DBMS_OUTPUT.PUT_LINE('bwtypesublen:::'+bwtypesublen);
bwtypesublen:=bwtypesublen-1;
DBMS_OUTPUT.PUT_LINE('bwtypesublen:::'+bwtypesublen);
bwvalue:=substr(crs_bandwidth.bwname,bwtypesublen,bwtypesublen);
DBMS_OUTPUT.PUT_LINE('bwvalue:::'+bwvalue);
if bwtype='mbps' then
DBMS_OUTPUT.PUT_LINE('bwtype in if condition:::'+bwvalue);
bwvalue:=bwvalue*1024;
DBMS_OUTPUT.PUT_LINE('bwtype in …Run Code Online (Sandbox Code Playgroud) 我在包中有一些过程/函数,-2291当违反FOREIGN KEY约束时捕获异常.
我从不同的过程中删除了异常,并在包体中声明它,如下所示:
e_ouder_niet_gevonden EXCEPTION;
PRAGMA EXCEPTION_INIT(e_ouder_niet_gevonden,-2291);
Run Code Online (Sandbox Code Playgroud)
现在当我使用包中的一个过程时没有问题.但是,我想要实现的是任何过程/函数都可以使用该异常.我该怎么做呢?
我有一个如下所示的声明,但它一次填写1000个电话.任何结果都会引发PLS-123错误程序太大戴安娜节点
begin
sp_myprocedure(....)
sp_myprocedure(....)
sp_myprocedure(....)
sp_myprocedure(....)
end
Run Code Online (Sandbox Code Playgroud)
我们正在转向11g,我想知道这种限制是否可以增加到2000例如.
谢谢
我想设置一个沙盒环境来磨练我的pl/sql和数据库技能.我正在考虑下载完整版的Oracle 11G并使用SQL Developer.设置测试数据库并从那里开始工作.
有什么建议?你认为这是一个好方法吗?
先感谢您!
我在PL SQL上很新,当我尝试写下面的代码时:
BEGIN FOR foo IN (SELECT A, B, C FROM foo_table WHERE some_conditions) LOOP
DBMS_OUTPUT.PUT_LINE('sth here')
END LOOP;
Run Code Online (Sandbox Code Playgroud)
在SQL Developer中执行statment时出现以下错误
当期望是以下一个时遇到符号"文件结束":开始案例声明结束例外以及更多...
我的陈述有什么问题?任何人都可以给我一个提示如何解决这个问题?所有提示我都会很高兴.
我怎样才能使用相同的文件(如ABC.txt)来编写UTL_FILE.
目前正在发生的事情是,当我试图写上ABC.txt一个条目被删除或替换为最新条目.我希望我所有的参赛作品都在场.我使用的是Oracle 10 g PL/SQL.
我有一个名为logger(message)的存储过程,其中message的类型为varchar2.
当我执行时
exec logger('hello');
Run Code Online (Sandbox Code Playgroud)
它表示匿名块已完成,此过程的作用只是在另一个表中插入记录.
但是,当我用它作为脚本的一部分说:
Begin
select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE_APPENTITY' and COLUMN_NAME = 'ORIGPTI_NUM' and DATA_SCALE is null;
IF (countCol <> 0) then
execute immediate 'alter table EVAPP_INTERFACE_APPENTITY add ORIGPTI_NUM_TMP NUMBER(14,2)' ;
execute immediate 'update EVAPP_INTERFACE_APPENTITY set ORIGPTI_NUM_TMP = ORIGPTI_NUM' ;
execute immediate 'alter table EVAPP_INTERFACE_APPENTITY drop column ORIGPTI_NUM' ;
execute immediate 'alter table EVAPP_INTERFACE_APPENTITY rename column ORIGPTI_NUM_TMP to ORIGPTI_NUM' ;
DBMS_OUTPUT.put_line('This column EVAPP_INTERFACE_APPENTITY.ORIGPTI_NUM has been modified to the required precision');
END IF; …Run Code Online (Sandbox Code Playgroud)