我尝试在 Oracle 11G 中创建存储过程,但出现以下异常:
Error(7,18): PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier> <a bind variable> continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date <a string literal with character set specification> <a number> <a single-quoted SQL string> pipe <an alternatively-quoted string literal with character set specification> <an alternat
Error(9,65): PLS-00103: Encountered the symbol …Run Code Online (Sandbox Code Playgroud) 请问,是否可以访问 varray 中的单个值?
像newVariable := myArray(value2)--> 这会将数组中的第二个值分配给新变量...
我还需要这样的东西:
FOR CYCLE...
x++
newVariable(x) := myArray(value(x))
END FOR CYCLE
Run Code Online (Sandbox Code Playgroud)
是否可以?
谢谢,我是信息技术专业的学生,我正在努力解决这个问题。不知道去哪里看...
我试图在对象上使用 table() 函数,以便在 PL/SQL 函数中进行联接。使用此功能时,查询可能需要长达 20 分钟才能完成;当我直接将数据输入到表中时,只需要不到 5 秒的时间。我无法弄清楚为什么会有如此显着的差异,但我最好的预感是连接表中列上的索引没有被使用。表和对象的列定义是相同的。
这是一些示例代码:
create or replace type VARCHAR20_TYPE is OBJECT
(
val varchar2(20 byte);
);
create or replace type VARCHAR20_TABLE is table of VARCHAR20_TYPE;
create or replace FUNCTION test_function(
in_project_ids VARCHAR20_TABLE
) RETURN INTEGER
IS
l_result INTEGER;
BEGIN
SELECT count(*) into l_result FROM project p JOIN TABLE(in_project_ids) t ON p.project_id = t.val;
RETURN l_result;
END;
Run Code Online (Sandbox Code Playgroud)
如果我in_project_ids在上面的示例中将其替换为具有相同列定义的真实表的联接,则会显着提高函数的性能。
我有一个带有 Oracle 11 的产品盒和一个名为 的架构A。出于测试目的,我需要产品数据的本地快照。数据不是很大,导出不成问题。我已经导出A到一组 SQL 文件(使用 DBeaver),每个表一个,内容如下:
INSERT INTO A.TABLE1 (F1, F2, F3) VALUES ('v11', 'v21', 'v31');
INSERT INTO A.TABLE1 (F1, F2, F3) VALUES ('v12', 'v22', 'v32');
Run Code Online (Sandbox Code Playgroud)
等等。问题是,出于开发目的,我使用名为 的模式B,因此在导入时我需要像这样的插入:
INSERT INTO B.TABLE1 (F1, F2, F3) VALUES ('v11', 'v21', 'v31');
INSERT INTO B.TABLE1 (F1, F2, F3) VALUES ('v12', 'v22', 'v32');
Run Code Online (Sandbox Code Playgroud)
我知道我可以找到并替换所有INSERT INTO A.内容INSERT INTO B.,这将解决我的问题,但也许我可以为模式创建某种别名B,这样我就可以这样做(伪代码):
CREATE ALIAS 'A' FOR SCHEMA 'B'
@TABLE1.sql
@TABLE2.sql
DELETE ALIAS 'A'
Run Code Online (Sandbox Code Playgroud) 我有两个具有相同结构和相同数据的emp表。copy_emp我希望如果发生任何变化都emp应该反映在copy_emp. 因此我创建了一个触发器,如下所示。
create or replace trigger t
after
insert or
update of empno or
delete
on emp
for each row
begin
case
when inserting then
insert into copy_emp(empno,ename,sal) values (:NEW.empno,:NEW.ename,:NEW.sal);
when updating then
if updating('empno') then
update copy_emp set copy_emp.empno=:new.empno where copy_emp.empno=:old.empno;
elsif updating('ename') then
update copy_emp set copy_emp.ename=:new.ename where copy_emp.ename=:old.ename;
elsif updating('sal') then
update copy_emp set copy_emp.sal=:new.sal where copy_emp.sal=:old.sal;
end if;
when deleting then
delete from copy_emp where empno = :old.empno; …Run Code Online (Sandbox Code Playgroud) 错误在哪里?编译以错误结束,我不知道哪里出了问题。
create or replace
PROCEDURE make_payoff(user_id_argument number)
is
begin
payoff_amount:= 0;
CURSOR Clicks IS
SELECT c.cpc FROM click as c JOIN widget w ON w.id = c.widget_id JOIN website web ON web.id = w.website_id WHERE web.user_id = user_id_argument AND c.payoff_id IS NULL;
BEGIN
FOR Click IN Clicks
LOOP
payoff_amount:= payoff_amount + Click.cpc;
END LOOP;
INSERT INTO payoff (user_id, amount) VALUES (user_id_argument, payoff_amount);
COMMIT;
end;
Run Code Online (Sandbox Code Playgroud)
我越来越:
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object S10306.MAKE_PAYOFF is invalid
ORA-06550: …Run Code Online (Sandbox Code Playgroud) 我有一个 Oracle 过程,它接受参数 (v_MessageText) 来更新表上名为 message_text 的列。message_text 列是 CLOB。我希望能够替换输入中的文本,因此如果用户输入 testABC ,它会将 testXYZ 输出到 message_text 列中。起初,这看起来很简单。我尝试在我的程序中运行下面的代码,但出现错误:
SELECT REPLACE (v_MessageText, 'ABC', 'XYZ') from dual;
Run Code Online (Sandbox Code Playgroud)
Oracle 给我的错误是:“PLS-00428:此 select 语句中需要一个 INTO 子句”。为什么?我在这里做错了什么?
如果我错了,请纠正我,但我的印象是调用 RAISE_APPLICATION_ERROR() 会强制回滚。为什么在 PL/SQL 触发器中允许调用 RAISE_APPLICATION_ERROR(),而不允许 ROLLBACK 语句和/或执行 ROLLBACK 语句的方法呢?
我感觉我错过了一个关键点:)
提前致谢!
我搜索了一些如何使用立即执行从 select 语句返回值的示例,但它不断返回错误“ORA-00903:无效的表名”。
这是代码示例:
DECLARE
LAST_NUMBER NUMBER;
CURSOR C_SEQUENCES IS
SELECT
A.SEQUENCE_NAME, B.TABLE_NAME, C.COLUMN_NAME
FROM
USER_SEQUENCES A
INNER JOIN
USER_CONSTRAINTS B ON A.SEQUENCE_NAME = REPLACE(B.CONSTRAINT_NAME, 'PK', 'SEQ_ID')
INNER JOIN
USER_CONS_COLUMNS C ON B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
B.CONSTRAINT_TYPE = 'P';
BEGIN
FOR REG IN C_SEQUENCES LOOP
EXECUTE IMMEDIATE 'SELECT MAX(:1) FROM :2' INTO LAST_NUMBER USING REG.COLUMN_NAME, REG.TABLE_NAME;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
是的,该表确实存在。
有任何想法吗?
我有一个小问题,我还不明白 dbms_output.put_line() 和 dbms_output.put() 之间的区别
set serveroutput on size 200000
Begin
dbms_output.put_line('A' || CHR(10) || 'B');
End;
/
exec dbms_output.put_line('A' || CHR(10) || 'B');
Run Code Online (Sandbox Code Playgroud)
上面给出了两行不同的输出A和B。但
exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line
Run Code Online (Sandbox Code Playgroud)
不打印任何内容。我正在使用SQL*Plus:版本 11.2.0.1.0 生产