天道酬勤,学无止境

plsql

Oracle (PL/SQL):UPDATE RETURNING 是并发的吗?(Oracle (PL/SQL): Is UPDATE RETURNING concurrent?)

问题 我正在使用带有计数器的表来确保子元素上的唯一 ID。 我知道使用序列通常更好,但我不能使用它,因为我有很多计数器(客户可以创建几个桶,每个桶都需要有自己的计数器,他们必须从1(这是一项要求,我的客户需要“人类可读”的密钥)。 我正在创建具有 prikey (bucket_id, num = counter) 的记录(我们称之为项目)。 我需要保证 bucket_id / num 组合是唯一的(所以使用序列作为 prikey 不会解决我的问题)。 行的创建不会在 pl/sql 中发生,所以我需要声明这个数字(顺便说一句:有间隙并不违反要求)。 我的解决方案是: UPDATE bucket SET counter = counter + 1 WHERE id = param_id RETURNING counter INTO num_forprikey; PL/SQL 返回 var_num_forprikey 以便可以创建项目记录。 问题: 即使用户同时要求存储桶中的新项目,我是否总是会获得唯一的 num_forprikey? 回答1 即使用户同时要求存储桶中的新项目,我是否总是会获得唯一的 num_forprikey? 是的,至少在一定程度上是这样。 第一个发出该更新的用户会获得该行的锁定。 因此,在用户 numero uno 提交(或回滚)之前

2021-09-19 15:32:24    分类:技术分享    oracle   concurrency   plsql

在 Oracle 过程中的字符串中调用函数调用(Invoking a function call in a string in an Oracle Procedure)

问题 我使用 Oracle 10g 编写了一个应用程序。 我目前正面临这个问题。 我将“文件名”作为 varchar2 类型的参数。 文件名可能包含的示例值是:'TEST || to_char(sysdate, 'DDD')'。 在该过程中,我想获取该文件名的值,如 TEST147。 当我写: select filename into ffilename from dual; 我得到值 ffilename = TEST || to_char(sysdate, 'DDD') 是有道理的。 但是我怎样才能解决这个问题并调用字符串值中的函数呢? 帮助表示赞赏。 谢谢。 回答1 动态执行字符串很容易...... create or replace function fmt_fname (p_dyn_string in varchar2) return varchar2 is return_value varchar2(128); begin execute immediate 'select '||p_dyn_string||' from dual' into return_value; return return_value; end fmt_fname; / 问题出现在您的字符串包含文字的地方,带有可怕的引号...... SQL> select fmt_fname('TEST||to

2021-09-19 10:56:37    分类:技术分享    oracle   plsql   oracle10g   dynamic-sql   plsqldeveloper

有什么办法可以加快以下插入的速度吗?(Is there any way I can speed up the following insert(s)?)

问题 有没有办法加快这段代码的速度? FOR j IN 1..max LOOP INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500)); END LOOP; 循环将发生至少一百万次,因此一百万次以上的插入。 我知道 FORALL,但那是针对已经存在的数据集合……对我没有帮助。 所以我想知道是否有比经典循环更好的方法,或者至少我可以做一些其他的改进(比如在我创建表时添加/删除一些选项),任何可以使这个运行更快的方法。 提前致谢! 回答1 您可能想尝试使用单个插入语句而不是执行一百万次语句: insert into myTable select dbms_random.value(1, 500), dbms_random.value(1, 500) from dual connect by level <= 1*1000*1000; 附带说明:您是否测量了执行dbms_random花费了多少时间以及实际插入值花费了多少时间? 回答2 在单个事务期间插入的一百万行将占用 UNDO 表空间中的大量空间。 IMO 更好的选择是使用一些中间提交来减少事务的跨度。 因此,基于@ReneNyffenegger 的回答,我建议如下: DECLARE nRows_inserted NUMBER

2021-09-19 00:06:12    分类:技术分享    sql   oracle   plsql

ORA 06533:下标数不胜数(ORA 06533: Subscript beyond count)

问题 我在简单的块下面创建了但得到 ORA 06533:下标数不胜数 错误。 有人可以告诉我我在下面的代码中缺少什么吗? declare type salaryvarray is varray(6) of customers.salary%type; salary_array salaryvarray:=salaryvarray(); c_salary customers.salary%type; i integer(2); counter number(2); begin salary_array.extend; select count(*) into counter from customers; for i in 1..counter loop select salary into c_salary from customers where id =i; salary_array(i):=c_salary; end loop; end; / 回答1 代码的array_var.extend部分需要在循环内。 每次添加时,都在分配新的内存。 跳过这一步是要求代码存储一些东西而不给它空间。 declare type salaryvarray is varray(6) of customers.salary%type; salary_array salaryvarray

2021-09-18 23:26:14    分类:技术分享    oracle   plsql

DBMS_UTILITY.COMPILE_SCHEMA(schema => '<SCHEMA_NAME>', compile_all => FALSE) doesn't compile invalid package bodies(DBMS_UTILITY.COMPILE_SCHEMA(schema => '<SCHEMA_NAME>', compile_all => FALSE) doesn't compile invalid package bodies)

问题 的呼唤 BEGIN DBMS_UTILITY.COMPILE_SCHEMA(schema => '<SCHEMA_NAME>', compile_all => FALSE); END; / 不编译无效的包体。 有人知道原因吗? (Oracle 数据库 11g 企业版 11.2.0.1.0 版 - 生产) 回答1 确实如此; 至少在 11.2.0.3 中,所以我想基本版本中可能存在错误。 如果我创建了一个无效的包,在这种情况下是因为它引用了一个不存在的表: create package p42 as procedure test; end p42; / PACKAGE P42 compiled create package body p42 as procedure test is n number; begin select count(*) into n from t42; end test; end p42; / PACKAGE BODY P42 compiled Errors: check compiler log 然后检查状态和上次 DDL 时间: select object_type, object_name, status, last_ddl_time from user_objects where object_name = 'P42' order by

2021-09-18 20:01:12    分类:技术分享    oracle   plsql

带有游标参数 oracle 的流水线函数(pipelined function with cursor parameter oracle)

问题 例如,如果我有这种功能 function test_pipe(p_source in t_cursor) return t_tab pipelined as --some code goes here t_cursor 是一个引用游标。 我知道我可以像这样调用这个函数 select * from table(test_pipe(cursor(select 1 from dual))); 但是如果我在包中声明游标并希望将其作为参数传递怎么办。 像这样的东西。 procedure test is v_ct pls_integer; cursor main_cur is select 1 from dual; begin select count(*) into v_ct from table(test_pipe(main_cur)); --some code end; 我得到 main_cur 无效标识符——pl/sql:ORA00904 错误。 我应该如何编码才能将 main_cur 作为参数传递给 test_pipe? 回答1 游标 main_cur 是从双中选择 1; 游标是用于从结果集中获取行的指针。 所以,当你做table(test_pipe(main_cur))你是不是传递一个行源的流水线功能。 您需要先获取行,然后传递行源。 测试用例: SQL> CREATE or

2021-09-18 19:57:25    分类:技术分享    oracle   plsql

plsql中的增量函数(increment function in plsql)

问题 在大多数编程语言中,您有一种快速的方法来为变量编写增量,如下例所示: inc(variableName); variableName++; variableName += 1; Oracle Pl/Sql 中有哪些方法可以做到这一点,而不是使用以下方法: variableName := variableName + 1; 回答1 操作员在文档中列出。 没有等价于++或+= 。 恐怕你得走很长的路。 您可以编写自己的inc()函数,但这可能会使您的代码对其他人的可读性降低,因为它是非标准的。

2021-09-18 16:17:39    分类:技术分享    oracle   plsql   oracle11g

如何在 Java 中映射 TYPE TABLE OF VARCHAR2(5)?(How to map TYPE TABLE OF VARCHAR2(5) in java?)

问题 我有一个带有下面签名的程序。 CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MYPACK AS PROCEDURE GETBOX (DSSO_BoxNumber IN VARCHAR2, CreateDateTime OUT tCreateDateTime, ReceiptDateTime OUT tReceiptDateTime, CSCBoxNumber OUT tCSCBoxNumber, DSSOBoxNumber OUT tDSSOBoxNumber, PackID OUT tPackID, RequestID OUT tRequestID, ExceptionID OUT tExceptionID, Name OUT tName, FolderID OUT tFolderID, ClosedDateTime OUT tClosedDateTime, OpenStatus OUT tOpenStatus, RequestOpenStatus OUT tRequestOpenStatus, RETURNED OUT tRETURNED) ... 自定义类型定义如下。 CREATE OR REPLACE PACKAGE MYSCHEMA.MYPACK AS TYPE tCreateDateTime is TABLE of

2021-09-18 16:16:57    分类:技术分享    java   sql   spring   oracle   plsql

遍历循环以查找重复的名称(Traverse through loop to find repeated names)

问题 我从查询中得到以下结果,我有一个 plsql 块,我在其中循环记录和 send_email 给客户。 匿名块 FOR i IN (SELECT product_no, product_holder,product_catalogue FROM product_master) LOOP mail_send('PRODMASTER',i.product_holder, i.product_no,i.product_catalogue); END LOOP; 我想知道如果product_holder在查询结果中重复,那么最好的方法是什么,而不是发送多封电子邮件,而是想发送一封包含相关详细信息的电子邮件。 例如,在上述情况下,SMITH 重复两次,因此使用上述方法 SMITH 将收到两封电子邮件,而我想向SMITH发送一封带有product_no和product_catalogue电子邮件 我怎样才能做到这一点? 回答1 不要为此在 PL/SQL 中的循环内执行循环 - 使用 SQL 为您提供可供使用的数据。 首先,我们用一些测试数据创建你的表(我猜是数据类型——你用你自己的替换): create table product_master ( product_no varchar2(10) , product_holder varchar2(10) , product

2021-09-17 22:51:40    分类:技术分享    sql   oracle   plsql

PL/SQL 中的 Oracle 数据库依赖项(Oracle database dependencies in PL/SQL)

问题 我需要找到函数/过程(在包体内部定义)和它们使用的表之间的依赖关系。 我试过all_dependencies但它只适用于包级别,而不是内部函数/过程级别。 是否有可能使用例如all_source找到此依赖all_source ? 在此先感谢您的帮助。 回答1 不可能找到过程(在包中)和表之间的依赖关系。 有多种工具可以检查依赖关系。 正如您已经发现的那样, *_DEPENDENCIES仅跟踪每个包级别的对象依赖性。 有一个简洁的工具 PL/Scope 可以跟踪包的各个部分之间的依赖关系。 但它不会跟踪所有表引用。 理论上你可以使用*_SOURCE 。 实际上,这是不可能的,除非您的代码使用一组有限的功能。 对于任何中等复杂的代码,忘记使用字符串函数或正则表达式来解析代码。 不幸的是,似乎没有任何可编程且能够准确解析复杂代码的 PL/SQL 解析器。 说“这是不可能的”并不是一个很好的答案。 但在这种情况下,它可能会为您节省大量时间。 这是很容易陷入死胡同并浪费大量精力的任务之一。

2021-09-17 21:54:52    分类:技术分享    sql   oracle   plsql