标签: plsql

绑定变量在 Oracle 中应该走多远?

我目前正在检查我们部门所有数据库用户的 SQL 代码是否没有使用绑定变量。我们确实在一段时间内遇到了 ORA-04031 错误。

现在,我非常清楚在何处使用它们,但我不确定这应该走多远。现在,我是否必须用绑定变量替换所有文字?

例如:

select 1 from t1 ; => select :one from table t;
Run Code Online (Sandbox Code Playgroud)

或者

select c1, c2, from t2 where id = :id and status = 2 =>
select c1, c2, from t2 where id = :id and status = :two
Run Code Online (Sandbox Code Playgroud)

或者

select * from t3 where c3 > :value and exists (select 1 from t4 where <some condition>) =>
select * from t3 where c3 > :value and exists (select :one from …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 plsql

3
推荐指数
1
解决办法
1458
查看次数

Oracle:即使 SERVEROUTPUT 变量设置为 ON 也不显示输出

我想知道为什么即使我将 SERVEROUPUT 变量设置为 ON 也不显示输出。

我有以下匿名块代码:

DECLARE
    v_rec_count number:=0;
BEGIN
    for rec in (SELECT T_A.ROWID, T_A.OPEN_COUNT, T_B.OPEN_COUNT as NEW_OPEN_COUNT
            FROM T_A
            INNER JOIN T_B ON
                T_A.KEYA = T_B.KEYA
            AND T_A.KEYB = T_B.KEYB
            AND T_A.OPEN_COUNT <> T_B.OPEN_COUNT) 
    loop
        v_rec_count := v_rec_count + 1;

        update T_A t1
        set t1.OPEN_COUNT = rec.NEW_OPEN_COUNT,
            t1.UPD_USER_ID = 'batch',
            t1.UPD_DATE = SYSDATE
        where t1.rowid = rec.rowid;
    end loop;

    dbms_output.put_line ('T_A UPDATE_TOTAL: ' || v_rec_count);
END;
/
Run Code Online (Sandbox Code Playgroud)

当我执行以下代码时,当我通过 sqlplus 运行 sql 文件时,我希望看到 dbms_output.put_line 的输出到 sql 提示符并最终看到日志文件。该块所做的输出只是“PL/SQL 过程已成功运行”。

我已经在块之前设置了 …

oracle plsql

3
推荐指数
1
解决办法
5万
查看次数

在删除记录之前检查记录是否存在是一种好习惯

在调查其他人编写的存储过程时,我遇到了以下 SQL/PLSQL:

1. V_COUNT NUMBER(5,0);
.........
2. SELECT COUNT(*) INTO V_COUNT FROM TABLE1 WHERE COL1='SOMEVALUE';
3. IF V_COUNT>0 THEN
4.   DELETE FROM TABLE1 WHERE COL1='SOMEVALUE';
5. END IF;
Run Code Online (Sandbox Code Playgroud)

仅第 4 行中的 DELETE 语句是否足以涵盖这 5 行中的所有逻辑?我首先想到可能 V_COUNT 用于其他地方,但事实并非如此。我想不出有什么好的理由使简单的删除语句如此复杂。您是否也认为这是一个糟糕的设计,或者有什么我看不到的地方?

oracle delete plsql

3
推荐指数
1
解决办法
2435
查看次数

如何从包内的另一个模式引用表?

我正在使用 TOAD 在我拥有的模式中创建一个包。我的包使用另一个模式的表。

该包有一个使用游标的过程。当我创建包时,出现编译错误:

正文 509 30 PL/SQL: ORA-00904: : 无效标识符

该错误指向游标的选择正在使用的表,并且该表位于其他架构中。

如果我直接在 TOAD 中运行查询,它会完美运行,我是 Oracle 新手,我不明白为什么会出现此错误。为什么我会收到此错误?

oracle plsql

3
推荐指数
1
解决办法
1万
查看次数

如何正确地从 Oracle 数据库中删除 java 源代码?

我的 Java 源代码有点卡在这里。首先我想从数据库中完全删除它,因为我想重新编译它,但我不能删除它,因为如果我执行这个命令:

drop java source "SCHEMA.JAVASOURCENAME";
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ORA-04043: object JAVASOURCENAME does not exist
Run Code Online (Sandbox Code Playgroud)

Javasource 本身具有这种结构(这是它的 plsql/java 代码):

create or replace and compile java source named myjavasource as

import java.io.*;
import some.custom.jar.one.*;
import some.custom.jar.two.*;
import some.custom.jar.three.*;

    public class MyJavaClass
    {
      public static String myjavafunction(String connectString, String identity, String password)
      {
       ...
      }
    }
Run Code Online (Sandbox Code Playgroud)

我以 DBA 身份和我的用户执行了这个“创建或替换和编译 java 源代码...”命令,我不知道这是否可能是问题所在。

所以我的问题是,我怎样才能删除这个 java 源代码?

我的第二个问题是我可以处理自定义 jars 吗?我用这个命令导入了它们:

call dbms_java.loadjava('-genmissing -r -v -force -grant SCHEMA ./some.custom.jar.one.jar');
Run Code Online (Sandbox Code Playgroud)

我还以 DBA 身份和我的用户执行了此操作。如果是检查无效对象:

SELECT *
    FROM user_objects
    WHERE …
Run Code Online (Sandbox Code Playgroud)

oracle plsql java

3
推荐指数
1
解决办法
1万
查看次数

级联主键更新到oracle中所有引用外键

更新主键时是否可以更新Oracle中所有引用的外键?

像这样的过程,获取表名和主键,查找所有表中的所有外键,并使用新值更新它

  PROCEDURE cascade_update_primary(
                          table_name IN VARCHAR2,
                          primary_column IN Number,
                          new_value IN Number);
Run Code Online (Sandbox Code Playgroud)

甲骨文不支持ON UPDATE CASCADE

oracle oracle-11g plsql cascade

3
推荐指数
1
解决办法
1万
查看次数

使用绑定变量时如何解决错误“ORA:01-006:绑定变量不存在”?

我有一个包含以下结构和数据的表:

create table TEST_TABLE
(
  item_number NUMBER,
  item_name   VARCHAR2(50),
  item_col    VARCHAR2(50),
  item_pol    VARCHAR2(50)
)
Run Code Online (Sandbox Code Playgroud)

样本数据:

item_number |  item_name|  item_col |  item_pol
------------------------------------------------
     1      |   blue    |     b     |   c
     2      |   red     |     d     |   a
     3      |   black   |     e     |   a
     4      |   yellow  |     d     |   b
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的示例过程bind variables

create or replace procedure test_bind_variable(res         out sys_refcursor,
                                               item_number varchar2,
                                               item_name   varchar2,
                                               item_col    varchar2,
                                               item_pol    varchar2) is

  qry varchar2(8000);

begin

  qry := 'select * from test_table where …
Run Code Online (Sandbox Code Playgroud)

oracle query oracle-11g-r2 plsql error-handling

3
推荐指数
1
解决办法
1万
查看次数

PL/SQL:按比例查询数字数据类型?

希望选择数字字段在小数点后有一定数据量的行

例如

select number from table where number.scale > 4;
Run Code Online (Sandbox Code Playgroud)

这是否可以直接执行,或者我必须转换为字符串并明智地解析字符

oracle plsql

2
推荐指数
1
解决办法
3810
查看次数

在 Oracle 中使用 First..Last 和 1..count 有什么区别?

在 Oracle 中使用First..Last1..count在 Oracle 中的区别是什么?

FOR i IN l_collection.FIRST..l_collection.LAST LOOP
Run Code Online (Sandbox Code Playgroud)

或者

FOR i IN 1..l_collection.COUNT LOOP
Run Code Online (Sandbox Code Playgroud)

oracle plsql data-collection

2
推荐指数
1
解决办法
5745
查看次数

当列有数据时 NVL(&lt;Column_name&gt;,Sequence.nextval) 的奇怪行为?

我创建了一个这样的序列:

CREATE SEQUENCE seq_test2
  MINVALUE 0
  MAXVALUE 999999999999999999999999999
  START WITH 0
  INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)

这两个查询都显示数字 0:

 select SEQ_TEST2.nextval from DUAL;   
 select SEQ_TEST2.currval from DUAL;
Run Code Online (Sandbox Code Playgroud)

我有一张桌子,你可以在这里看到:

create table STUDENT
(
  st_id      NUMBER,
  first_name VARCHAR2(150),
  last_name  VARCHAR2(150)
)
Run Code Online (Sandbox Code Playgroud)

执行下面的查询后,

select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t
Run Code Online (Sandbox Code Playgroud)

当列中没有空值时st_id,我得到的结果是这样的:

    st_id    seq
   ---------------
      1       1
      2       2
      3       3
      4       4
      5       5
Run Code Online (Sandbox Code Playgroud)

当我插入列为 null 的行时st_id,执行上面的查询后,结果如下所示:

      st_id    seq
   ---------------
       1       1
       2       2
       3       3
       4       4 …
Run Code Online (Sandbox Code Playgroud)

oracle query oracle-11g-r2 plsql sequence

2
推荐指数
1
解决办法
372
查看次数