标签: plsql

PL/SQL 调用过程

我编写了一个 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

plsql stored-procedures procedure procedures oracle11g

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

我可以在 PL/SQL 中使用 IF 吗?

我做了一个表格和四个序列。(一列一个序列,一列三个序列。)

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 列发送 …

sql oracle plsql

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

如果在循环 PL SQL 中满足条件,如何退出过程

假设我有一个 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'放在循环之外,那么我想无论循环的结果是什么,当循环结束时它都会退出整个过程?

sql oracle plsql loops procedure

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

在 Oracle 12c 的 JSON_VALUE 中使用特殊字符的问题

我在 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 编译错误。 …

sql oracle json plsql oracle12c

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

PLS-00049:绑定变量错误?

看不到我的代码哪里错了...有人可以解释一下我做错了什么吗?我尝试了一切,从:new."new_name"添加表前缀:NEW.sh_name到:NEW.name不知道还能做什么......

\n\n

这是表:

\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  );\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是超级英雄表:

\n\n
create table superhero(\n  v_name varchar2(20)\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是触发器:

\n\n
create 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)

sql plsql oracle11g

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

ORACLE:使用可选参数创建 oracle 过程

在大多数 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,谢谢

oracle plsql optional-parameters

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

如何在 SELECT INTO 语句中使用数字表

我想将表 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 进行比较?

谢谢!

sql oracle plsql user-defined-types

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

Oracle 使用 LOOP 批量收集到集合中

http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html

在此页面中,他们提到:

当您使用 BULK COLLECT 和集合从游标中获取数据时,您永远不应该依赖游标属性来决定是否终止循环和数据处理。

他提到,为了确保我们的查询处理所有行,我们应该

不使用:

退出时间

光标%NOTFOUND;

我们应该使用:

退出时间

集合变量.count=0;

是什么原因?

oracle plsql bulk-collect

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

使用 Excel 中的数据更新 (Oracle) 数据库

我有一个像这样的 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,但也欢迎其他技术。

谢谢 !

python oracle excel plsql

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

Oracle模式用户无法在过程中创建表

我正在尝试在过程中创建临时表:

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)

oracle plsql create-table

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