标签: plsql

PL/SQL动态SQL USING子句

我正在使用Oracle 11g数据库,发布11.2.0.3.0 - 64位生产

我有几个已定义的包,过程,函数和数据类型.在使用集合,数组和其他数据结构进行大量中间计算之后,我最终需要动态创建数据库表以输出我的最终结果.出于这个问题的目的,我有以下内容:

TYPE ids_t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;

benefit_ids ids_t;

--Lots of other code which successfully populates benefit_ids. 
--benefit_ids has several million rows, and is used successfully as 
  the input to the following function:

FUNCTION find_max_ids(in_ids in ids_t)
RETURN ids_t
IS
    str_sql varchar2(200);
    return_ids ids_t;
BEGIN
    str_sql := 'SELECT max(b.benefit_id)
                FROM TABLE(:1) a
                JOIN benefits b ON b.benefit_id = a.column_value
                GROUP BY b.benefit_id';

    EXECUTE IMMEDIATE str_sql BULK COLLECT INTO return_ids USING in_ids;

    RETURN return_ids; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql

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

创建触发器引发异常

我试图在插入表之前编写一个触发器.

它检查特定值,如果它无效,它将引发异常

CREATE OR REPLACE TRIGGER insert_birthdate
      BEFORE INSERT ON student 

DECLARE 
     invalid_date EXCEPTION ;
BEGIN
    IF(NEW.birthdate >= sysdate - interval '16' year )
    THEN RAISE invalid_date ;
    END IF ;
EXCEPTION
    WHEN invalid_date THEN
         RAISE_APPLICATION_ERROR(-20500, 'AGE MUST BE GREATER THAN 16 !!');
END;
/
Run Code Online (Sandbox Code Playgroud)

这是行不通的.

这个输出,有什么帮助吗?

Warning: Trigger created with compilation errors.

SQL>
SQL> show errors
Errors for TRIGGER INSERT_BIRTHDATE:

LINE/COL ERROR
-------- ----------------------------------------------------------
4/2      PL/SQL: Statement ignored
4/8      PLS-00201: identifier 'NEW.BIRTHDATE' must be declared
SQL>
Run Code Online (Sandbox Code Playgroud)

sql triggers plsql

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

可以在PL/SQL中添加多个列和Alias吗?

一般来说,我对SQL编写非常环保.我试图做的是从具有多个JOINS和WHERE Criteria的SELECT查询返回一个奇异值.

EX:以下返回我之后讨论的3个值:

SELECT TBL5.FIELD1, TBL5.FIELD2, TBL5.FIELD3 
FROM TBL1 PA
JOIN TBL2 PH ON PH.PAID = PA.PAID
JOIN TBL3 CM ON CM.CMID = PA.ECMID
JOIN TBL4 HD ON CM.SURID = HD.PHID
JOIN TBL5 PD ON PD.PHID = HD.PHID
WHERE PH.PSID = 1234
AND PA.PAID = 10039528
AND NVL(PA.ECMID,0) > 0
AND CM.CMTV = 'EECR'
AND PD.MAID = 939252
Run Code Online (Sandbox Code Playgroud)

我想要做的是将所有三列TBL5.FIELD1,TBL5.FIELD2,TBL5.FIELD3的值返回为(1)别名字段.根据我目前正在检索的记录,最后2个字段为空,第一个字段返回-32.47.但是当我执行下面的操作时,我得到的所有内容都是[null]而不是预期的(-32.47 + null + null)=( - 32.47)?

SELECT (TBL5.FIELD1 + TBL5.FIELD2 + TBL5.FIELD3) AS TOTAL_REFUND
FROM TBL1 PA
JOIN TBL2 PH ON …
Run Code Online (Sandbox Code Playgroud)

sql oracle null select plsql

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

过程不适用于Oracle数据库

我正在尝试编写一个简单的"Hello World"程序....但它无法正常工作

代码:

CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
   dbms_output.put_line('Hello World!');
END;
/
Run Code Online (Sandbox Code Playgroud)

之后我像这样执行:

EXECUTE greetings;
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

ORA-00900:无效的SQL语句

图片在这里:

在此输入图像描述

在此输入图像描述

请尽快帮帮忙...谢谢:)

oracle plsql

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

PLSQL-如何退出FORALL循环

我在一个过程中有以下代码片段,当前 apps.fnd_global. apps_initialize方法执行是FORALL循环的一部分.

我想apps.fnd_global. apps_initialize不要在循环中打电话.插入完成后,apps.fnd_global. apps_initialize应该只执行一次.

我怎样才能做到这一点?

FORALL i IN 1 .. my_array.COUNT
         INSERT
           INTO my_table
            ......
      COMMIT;         

         apps.fnd_request.submit_request (application   => 'PO',
                                          program       => 'REQIMPORT',
                                          argument1     => l_p4,
                                          argument2     => l_p5,
                                          argument3     => l_p6,
                                          argument4     => '',
                                          argument5     => 'N',
                                          argument6     => 'N');
      COMMIT;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql stored-procedures oracle11g

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

PL / SQL:数字或值错误

我遇到错误,不知道为什么:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.STANDARD", line 394
ORA-06512: at "DOMINOS.DISTANCE", line 10
ORA-06512: at "DOMINOS.ZOEKWINKELVOORADRES", line 19
ORA-06512: at line 5
Run Code Online (Sandbox Code Playgroud)

光标应包含145行。当我执行该过程时,我在54行之后收到上面的错误消息。

create or replace procedure zoekWinkelVoorAdres
    (v_postcode in postcode.postcode%type,
      v_huisnr in WINKEL.HUISNR%type,
      v_id out WINKEL.ID%type,
      v_afstand out number)
is
    type lat_array is varray(100000) of POSTCODE.LAT%type;
    type lon_array is varray(100000) of POSTCODE.LON%type;
    type id_array is varray(100000) of winkel.id%type;
    a_lat lat_array;
    a_lon lon_array;
    a_id id_array;
    latwin postcode.lat%type;
    lonwin postcode.lon%type;
    latklant postcode.lat%type;
    lonklant postcode.lon%type;
    vafstand number(38);
    cursor …
Run Code Online (Sandbox Code Playgroud)

oracle plsql ora-06502

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

如何在plsql包规范中传递数组类型?

我是plsql的新手.我试图在同一个包下放两个脚本.这些脚本处理数组.如何将数组传递给过程?如果我要声明数组,我是在规范还是正文中做到的?我现在正在尝试这个但它不起作用.

CREATE PACKAGE cop_cow_script AS

PROCEDURE COP_COW_DATALOAD_V2(arr_claims VARRAY(15000) OF VARCHAR2(10), arr_sql VARRAY(500) OF VARCHAR2(1000));

END cop_cow_script;
Run Code Online (Sandbox Code Playgroud)

如你所见,我想传递这两个数组.

oracle plsql

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

为什么Oracle需要Select Into来进行普通查询

我有以下简单的代码:

 declare
 var number;

 Begin
   var := 1;
   select * from Table where Table_ID = :var;
 end;
Run Code Online (Sandbox Code Playgroud)

执行它,我收到错误

在SELECT语句中需要一个INTO子句

如果我只是输入它...

select * from Table where Table_ID = 1; 
Run Code Online (Sandbox Code Playgroud)

...有用!

这个错误来自哪里?为什么我需要一个Into条款?

oracle plsql

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

想要从游标查询中获取别名的值

代码如下:

cursor c1 is
select x, y, a.z, b.z "a1" from t3 a, t4 b;
Run Code Online (Sandbox Code Playgroud)

以下从c1获取数据为

insert into t1 (x, y, z, z1) values (c1.x, c1.y, c1.z, c1.a1);
Run Code Online (Sandbox Code Playgroud)

编译后,由于未声明组件a1,因此出现错误.和列不允许在这里.PLSQL的新功能,因为我认为不需要声明别名.

sql oracle plsql

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

为什么我不能在PLSQL匿名块之后直接编写DDL?

我有以下简单的脚本.

declare
begin
  null;
end;

create table &&DB_SCHEMA..test_table (
   test_column varchar(20)
);
Run Code Online (Sandbox Code Playgroud)

执行它以以下错误结束

ORA-06550:第6行第1列:

PLS-00103:遇到符号"CREATE"

  1. 00000 - "行%s,列%s:\n%s"

*原因:通常是PL/SQL编译错误.

*行动:

匿名阻止后我不能直接使用DDL吗?我是否被迫EXECUTE IMMEDIATE在匿名区内进行此操作?

oracle ddl plsql sql-scripts

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