我想创建一个这样的存储过程:
PROCEDURE P_CUSTOMER_UPDATE
(
pADSLTable IN Table,
pAccountname IN NVARCHAR2,
pStatus IN NUMBER,
pNote IN NVARCHAR2,
pEmail IN NVARCHAR2,
pMobi IN NVARCHAR2,
pServiceTypeID IN NUMBER,
pDate IN DATE
)
IS
BEGIN
UPDATE pADSLTable
SET STATUS = pStatus, NOTE = pNote, EMAIL = pEmail, MOBI = pMobi, SERVICETYPE_ID = pServiceTypeID, ACTIVATION_DATE = pDate
WHERE ACCOUNT_NAME = pAccountname;
END;
Run Code Online (Sandbox Code Playgroud)
当然,Oracle不允许我这样做.有办法解决这个问题吗?非常感谢你.
我有这样一张桌子:
UserID Customer ID status
1 1 1
1 2 1
1 3 1
1 4 2
1 5 1
1 6 3
1 7 2
2 8 1
2 9 2
........
Run Code Online (Sandbox Code Playgroud)
我想总结一下这个表,对此:
UserID count(status 1) count(status 2) count(status 3)
1 4 2 1
2 1 2 3
.........
Run Code Online (Sandbox Code Playgroud)
我怎么能在PL/SQL中做到这一点?
预先感谢
我有一个'过程A',它必须将一个空光标返回到前端,然后立即继续下一步,它将调用一个过程,该过程将花费20分钟来完成过程.
Procedure A(cur_out refcursor)
begin
OPEN cur_out for
select
null empname,
null empid
from dual;
procedure B();//Will take 20 min
end;
Run Code Online (Sandbox Code Playgroud)
这里'Procedure A'应返回null游标而不等待'Procedure B'完成.
如何在oracle中实现这一点.
提前致谢.
我试图尽快将记录从一个表复制到另一个表.
目前我有一个类似于此的简单光标循环:
FOR rec IN source_cursor LOOP
INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
Run Code Online (Sandbox Code Playgroud)
我想加快它的速度,所以我正在尝试一些BULK操作(BULK FETCH,然后是FORALL插入):
这是我对批量选择/ forall插入的内容.
DECLARE
TYPE t__event_rows IS TABLE OF _event%ROWTYPE;
v__event_rows t__event_rows;
CURSOR c__events IS
SELECT * FROM _EVENT ORDER BY MESSAGE_ID;
BEGIN
OPEN c__events;
LOOP
FETCH c__events BULK COLLECT INTO v__event_rows LIMIT 10000; -- limit to 10k to avoid out of memory
EXIT WHEN c__events%NOTFOUND;
FORALL i IN 1..v__event_rows.COUNT SAVE EXCEPTIONS
INSERT INTO destinatoin
( col1, col2, a_sequence)
VALUES
( v__event_rows(i).col1, …Run Code Online (Sandbox Code Playgroud) 我必须从某些表中生成一些百万更新,以更新自己.我最近刚刚了解到parallel(tablename,threads),当我运行这样的东西时,PLIS开发人员的性能真正得到了改善:
select /* + parallel(table1,100) parallel(table2,100) */
'update table1 set id = 1 where ... and id = '||table1.id||' ...
where ...
Run Code Online (Sandbox Code Playgroud)
(我这样做,因为它在更新时给了我备份数据.我的BOSS告诉我这样做;-))
因此,当在set id = 1部件和PLSQL Developer中使用静态数字时,它确实很快.
但后来我把它写到一个文件中,然后插入一个create sequence,并尝试使用如下序列:
create sequence myseq
start with 4200000
increment by 1
maxvalue 11200000;
select /* + parallel(table1,100) parallel(table2,100) */
'update table1 set id = '||myseq.nextval||' where ... and id = '||table1.id||' ...
where ...
Run Code Online (Sandbox Code Playgroud)
但现在它非常缓慢.我不知道为什么.我只是重新编写了update生成器,在那里插入静态数据,然后用awk一系列数字替换它,但是有人可以解释导致这种情况的原因(我可以对它做些什么)吗?
提前致谢!
注意:请回答所有的答案,谢谢,但我们已经有一个序列..并且不能使用UNIQUE约束,因为有些项目需要重复...我需要以某种方式使用PLSQL处理这个,所以基于一些标准(使用一个如果声明)我需要确保没有重复的东西..而且只是为了确认,这些标识符是非常自定义的不同类型的字符串..并且对于每组字符串,我们有一个数字仅仅为该字符串计数(STR-STR - ####)我们有数百种这样的STR-STR组合,对于每种组合,我们都有一个####,它们可以计算......除此之外,还允许一些STR-STR组合有重复..所以我们不能使用UNIQUE CONTRAINTS,我们不能使用PRIMARY KEY,因为它不是一个简单的数字,最重要的是我们确实有一个PRIMARY KEY分配给每个项目..这些标识符适用于用户,而不适用于数据库管理.
当用户创建一个项目时,基于某个creteria,我们给项目一定数量..在保存功能中,调用一个函数来准备第一个初始字符串,然后扫描保存数字的表格并且分配该特定字符串的下一个可用4位数字.
现在有一些问题,在获取下一个数字和提交数据库之间有大约1000行代码.问题是当2个人在几秒钟内创建具有相同标准的项目时,有时会发出相同的数字.
我所做的就是在提交之前,我检查数据库中的数字,如果存在,我调用该函数再次获取下一个可用数字...
即使这段代码减少了重复的可能性,如果我同时保存2个项目,我仍然会得到一个重复的数字..
任何人都知道如何避免重复并将重复数字的机会降至0?
EDIT1:我们已经有了一个主键..这个标识符是一个特殊的字符串,并且非常自定义,因此不可能只使用从0开始计数的数字
编辑2:还有一些情况我们需要重复..这是非常小的(可能大约10个不同的项目轨道使用重复)所以在我使用if语句提交之前检查重复项之前,所以如果项目保存dosn' t属于应该有重复的系统之一,我跳过检查...
编辑3:我们在这里使用PL/SQL
编辑4:我猜这个问题是非常具体的,我没有完全传达它.虽然有很多答案,但没有人真的抓住了我的问题..无论如何,我解决了问题并在下面添加了我的答案..
我试图使用Execute Immediate在下面运行此代码,但它不起作用,值是正确的.
请提供正确的代码.
declare
v_count number:=1;
v_conc_name varchar2(400);
v_val VARCHAR2(20):='vineet';
BEGIN
v_conc_name:='INT_AP_PAY_CONV';
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details
SET
PARAMETER'||v_count||'='
||v_val||' where CONCURRENT_PROGRAM_SHORT_NAME= '||v_conc_name;
end;
Run Code Online (Sandbox Code Playgroud) 为记录持久性编写oracle包的最佳解决方案是什么?我总是写这样的东西:
create or replace
PACKAGE BODY "USP_PRICELIST" AS
PROCEDURE usp_TABLE1Save
(
pErrorCode OUT NUMBER,
pMessage OUT VARCHAR2,
pPARAM1 IN CHAR,
pPARAM2 IN CHAR
)
IS
BEGIN
pErrorCode := 0;
INSERT INTO TABLE1
(PARAM1, PARAM2)
VALUES
(pPARAM1, pPARAM2);
EXCEPTION
WHEN OTHERS THEN pErrorCode := SQLCODE; pMessage := SQLERRM;
END usp_TABLE1Save;
END USP_PRICELIST;
Run Code Online (Sandbox Code Playgroud)
我想知道是否必须在INSERT INTO之后进行COMMIT.
阿尔贝托
我有一个SQL脚本使用"创建数据库链接"连接到另一个数据库,并复制一些数据.
在使用完毕后,是否应删除或关闭此数据库基本链接?(说,假设我可能不会再需要它).
什么是最佳做法?
我听到我的团队有一些相互矛盾的答案.
如果我要关闭它,我如何确保在我打电话时关闭链接:
drop database link somelink;
Run Code Online (Sandbox Code Playgroud)
(我得到错误抱怨我打开了连接,这很奇怪,因为我没有执行任何异步操作/作业).
对于SQL调优的新手,人们可以提供指针和信息性的URL,这些URL可以帮助我如何处理SQL查询以及在必要时定义索引,当涉及调整大量数据表的SQL查询时数据超过50,000行?
为了加速SQL语句,我应该注意哪些主要内容?
oracle ×10
plsql ×10
sql ×6
performance ×2
bulkinsert ×1
database ×1
duplicates ×1
oracle10g ×1
sequence ×1