我编写了一个 PL/SQL 程序来更新 Employee 表的工资
create table Employee
(ID VARCHAR2(4 BYTE) NOT NULL,
First_Name VARCHAR2(10 BYTE),
Last_Name VARCHAR2(10 BYTE),
Start_Date DATE,
End_Date DATE,
Salary Number(8,2),
City VARCHAR2(10 BYTE),
Description VARCHAR2(15 BYTE)
)
/
Run Code Online (Sandbox Code Playgroud)
这就是程序
CREATE OR REPLACE PROCEDURE update_employee_salary(
p_factor IN NUMBER
) AS
v_employee_count INTEGER;
BEGIN
UPDATE employee
SET salary = salary * p_factor;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END update_employee_salary;
/
Run Code Online (Sandbox Code Playgroud)
当我尝试调用该过程时
CALL update_employee_salary (1.5)
Run Code Online (Sandbox Code Playgroud)
甲骨文显示ORA-00900: invalid SQL statement
我做了一个表格和四个序列。(一列一个序列,一列三个序列。)
CREATE TABLE abc (
whole_number VARCHAR2(100) primary key,
board_number VARCHAR2(100),
board VARCHAR2(100),
content VARCHAR2(100)
);
CREATE SEQUENCE whole_seq
MINVALUE 1
NOMAXVALUE
INCREMENT BY 1 START WITH 1
;
CREATE SEQUENCE notify_seq
MINVALUE 1
NOMAXVALUE
INCREMENT BY 1 START WITH 1
;
CREATE SEQUENCE product_seq
MINVALUE 1
NOMAXVALUE
INCREMENT BY 1 START WITH 1
;
CREATE SEQUENCE guide_seq
MINVALUE 1
NOMAXVALUE
INCREMENT BY 1 START WITH 1
;
Run Code Online (Sandbox Code Playgroud)
我想创建一个过程,为每行的 Whole_number 列添加 Whole_seq,如果 board 列获得“guide”,则为 board_number 列添加guide_seq。如果 board 列获得“notify”,则为 board_number 列发送 …
假设我有一个 for 循环
for i in array.first .. array.last loop
boolean := c(i) > d(i);
if boolean --is true then
exit the loop immediately and also exit the entire procedure
else if the boolean is never true til the end of the loop, exit the loop
and keep running other scripts in this procedure.
Run Code Online (Sandbox Code Playgroud)
我知道“EXIT”关键字需要位于循环内部,以便在满足条件时退出循环。并且“RETURN”需要位于循环之外,以退出程序。
但是如果我把'RETURN'放在循环之外,那么我想无论循环的结果是什么,当循环结束时它都会退出整个过程?
我在 Oracle 12c 上运行以下代码:
DECLARE
l_json clob;
l_var varchar2(90);
BEGIN
l_json := '{
"value>50": {
"id": "file",
"value": "55",
"popup": {
"menuitem": [{
"value": "New",
"onclick": "CreateNewDoc()"
},
{
"value": "Open",
"onclick": "OpenDoc()"
},
{
"value": "Close",
"onclick": "CloseDoc()"
}]
}
}
}';
SELECT JSON_VALUE(l_json, '$.value>50.value') INTO l_var FROM dual;
DBMS_OUTPUT.PUT_LINE('var: '||l_var);
END;
Run Code Online (Sandbox Code Playgroud)
运行它时,我收到以下错误:
错误报告 -
ORA-06550:第 17 行,第 47 列:
PL/SQL:ORA-40442:JSON 路径表达式语法错误
ORA-06550:第 17 行,第 1 列:
PL/SQL:忽略 SQL 语句
06550。00000 - “行 % s,列 %s:\n%s"
*原因:通常是 PL/SQL 编译错误。 …
看不到我的代码哪里错了...有人可以解释一下我做错了什么吗?我尝试了一切,从:new."new_name"添加表前缀:NEW.sh_name到:NEW.name不知道还能做什么......
这是表:
\n\n CREATE TABLE sh_auro (\n\xe2\x80\x83\xe2\x80\x83 new_name \xe2\x80\x83\xe2\x80\x83varchar2(30),\n\xe2\x80\x83\xe2\x80\x83 old_name \xe2\x80\x83\xe2\x80\x83varchar2(30),\n\xe2\x80\x83\xe2\x80\x83 user_name \xe2\x80\x83\xe2\x80\x83varchar2(30),\n\xe2\x80\x83\xe2\x80\x83 entry_date \xe2\x80\x83\xe2\x80\x83varchar2(30),\n\xe2\x80\x83\xe2\x80\x83 operation \xe2\x80\x83\xe2\x80\x83varchar2(30)\n );\nRun Code Online (Sandbox Code Playgroud)\n\n这是超级英雄表:
\n\ncreate table superhero(\n v_name varchar2(20)\n);\nRun Code Online (Sandbox Code Playgroud)\n\n这是触发器:
\n\ncreate or replace trigger superhero_auro\nbefore insert or delete or update on superhero\nfor each row\nenable\n\ndeclare\n v_user varchar2(30);\n v_time varchar2(30);\nbegin\nselect user, TO_CHAR(sysdate, \'DD/MON/YYYY HH24:MI:SS\') into v_user, v_time from dual;\nif inserting then\n insert into sh_auro(new_name, old_name, user_name, entry_date, operation) values(:NEW.new_name, null, v_user, v_time, \'Insert\');\nelsif deleting then\n insert …Run Code Online (Sandbox Code Playgroud) 在大多数 ASP.NET 应用程序中,带有过滤器的页面很常见(通常有 5 个或更多条件,例如:filter by:lastname、firstname、date 等)。
主要处理 TSQL (SQL Server 2000/2005)。我会在程序中处理标准,例如:
PARAMETERS Param1 VARCHAR(32), Param2 INT;
SELECT columns FROM table WHERE
([Param1] IS NULL OR column1 = [Param1])
AND
([Param2] IS NULL OR column2 = [Param2])
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何处理可选参数 PL/SQL,谢谢
我想将表 OS_CW.CW_FELDDATEN 属性的 PRIMITIVUMNUMMER (NOT NULL NUMBER(38)) 与本地数组 中的值进行比较v_list_pNummber。这是我到目前为止所拥有的:
DECLARE
TYPE array_of_numbers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
v_list_parentID array_of_numbers;
v_list_pNummer array_of_numbers;
BEGIN
SELECT DBUID BULK COLLECT INTO v_list_parentID
FROM OS_SYS.V_CATALOG
WHERE PARENTID = 1;
SELECT PRIMITIVUMNUMMER BULK COLLECT INTO v_list_pNummer
FROM OS_CW.CW_FELDDATEN
WHERE KATALOG IN (v_list_parentID);
END;
Run Code Online (Sandbox Code Playgroud)
运行上面的代码时,我收到此错误:
错误报告 -
ORA-06550: 第 28 行,第 104 列:
PLS-00382: 表达式类型错误
06550.00000 - “行 %s,列 %s:\n%s”
*原因:通常是 PL/SQL 编译错误。
*行动:
如何将列(数字)与表 NUMBER INDEX BY BINARY_INTEGER 进行比较?
谢谢!
http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html
在此页面中,他们提到:
当您使用 BULK COLLECT 和集合从游标中获取数据时,您永远不应该依赖游标属性来决定是否终止循环和数据处理。
他提到,为了确保我们的查询处理所有行,我们应该
不使用:
退出时间
光标%NOTFOUND;
我们应该使用:
退出时间
集合变量.count=0;
是什么原因?
我有一个像这样的 Oracle 表:Order_ID、Project_ID。
Order_ID 是主键。
Project_ID 应该有一个值,但在许多情况下保留为空。
现在我有一个 Order_ID 和 Project_ID 的列表,这是正确的数据,但这是在 Excel 中。
我必须更新我的 oracle 数据库来匹配项目,如下所示:
我的 Oracle 数据库上的错误数据:
订单_ID、项目_ID 1000, 20090 1001,空 1002,空
Excel 中提供的正确数据:
订单_ID、项目_ID 1001、22565 1002, 25548
Oracle 数据库中的更新数据应如下所示:
订单_ID、项目_ID 1000, 20090 1001、22565 1002, 25548
请记住,我并不是在寻找 sql 语句来为每个 ids/lines 执行此操作,而是想象我有数百万个更新需要进行,并且希望通过循环将其自动化。
我很喜欢使用 PL/SQL 和 Python,但也欢迎其他技术。
谢谢 !
我正在尝试在过程中创建临时表:
PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
-- sanity checks removed for readablity
EXECUTE IMMEDIATE
'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
'ON COMMIT PRESERVE ROWS AS ' ||
'SELECT * FROM infop_stammdaten.bp';
END;
Run Code Online (Sandbox Code Playgroud)
如果我将该BEGIN.._END块复制到 SQL 工作表,则一切正常。所以我认为用户有权创建临时表。如果我从同一个 SQL 工作表执行该过程,我会得到
Fehlerbericht -
ORA-01031: Nicht ausreichende Berechtigungen
ORA-06512: in "INFOP_STAMMDATEN.PA_DELETE_FP", Zeile 16
ORA-06512: in Zeile 6
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without …Run Code Online (Sandbox Code Playgroud) plsql ×10
oracle ×8
sql ×5
oracle11g ×2
procedure ×2
bulk-collect ×1
create-table ×1
excel ×1
json ×1
loops ×1
oracle12c ×1
procedures ×1
python ×1