我目前正在检查我们部门所有数据库用户的 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) 我想知道为什么即使我将 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 过程已成功运行”。
我已经在块之前设置了 …
在调查其他人编写的存储过程时,我遇到了以下 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 用于其他地方,但事实并非如此。我想不出有什么好的理由使简单的删除语句如此复杂。您是否也认为这是一个糟糕的设计,或者有什么我看不到的地方?
我正在使用 TOAD 在我拥有的模式中创建一个包。我的包使用另一个模式的表。
该包有一个使用游标的过程。当我创建包时,出现编译错误:
正文 509 30 PL/SQL: ORA-00904: : 无效标识符
该错误指向游标的选择正在使用的表,并且该表位于其他架构中。
如果我直接在 TOAD 中运行查询,它会完美运行,我是 Oracle 新手,我不明白为什么会出现此错误。为什么我会收到此错误?
我的 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中所有引用的外键?
像这样的过程,获取表名和主键,查找所有表中的所有外键,并使用新值更新它
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。
我有一个包含以下结构和数据的表:
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) 希望选择数字字段在小数点后有一定数据量的行
例如
select number from table where number.scale > 4;
Run Code Online (Sandbox Code Playgroud)
这是否可以直接执行,或者我必须转换为字符串并明智地解析字符
在 Oracle 中使用First..Last和1..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) 我创建了一个这样的序列:
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)