标签: plsql

ORA-22275:指定了无效的LOB定位符

我有很大的Oracle函数,用于计算6个表中的数据.

create or replace FUNCTION STATISTICS_FUNCTION(NAMEIN IN VARCHAR2

)
RETURN CLOB
AS
    LAST_60_CPU NUMBER;
    .............

    LINE CLOB;

    CURSOR LAST_60_CPU_CURSOR IS
     .................

BEGIN

    LINE := EMPTY_CLOB();
    DBMS_LOB.CREATETEMPORARY(LINE,true);
  OPEN LAST_60_CPU_CURSOR;
   LOOP
      FETCH LAST_60_CPU_CURSOR INTO LAST_60_EVENT_DATE, LAST_60_CPU;
      ....................
      DBMS_LOB.APPEND(LINE, TO_CHAR(LAST_60_EVENT_DATE));
      DBMS_LOB.APPEND(LINE, 'I');
      DBMS_LOB.APPEND(LINE, TO_CHAR(LAST_60_CPU));
      DBMS_LOB.APPEND(LINE, CHR(10));
   END LOOP;
   CLOSE LAST_60_CPU_CURSOR;
   DBMS_LOB.APPEND(LINE, 'LAST_60_CPU');
   DBMS_LOB.APPEND(LINE, CHR(10));
.......................................................

-------------------------------------
DBMS_OUTPUT.PUT_LINE(LINE);

  RETURN LINE;
END STATISTICS_FUNCTION;
Run Code Online (Sandbox Code Playgroud)

我使用这个Java代码来调用函数:

public void callFunction() throws SQLException
{
// initialize the driver and try to make a connection

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = …
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle10g oracle11g

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

包的初始化部分

这是包规范:

CREATE OR REPLACE PACKAGE employee_info
IS
  PROCEDURE p;

  FUNCTION f RETURN BOOLEAN;

END employee_info;
Run Code Online (Sandbox Code Playgroud)

这是包体:

CREATE OR REPLACE PACKAGE body employee_info
IS
  PROCEDURE p IS
  BEGIN
    dbms_output.put_line('This is procedure');
    dbms_output.put_line(chr(10));
  END;

  FUNCTION f RETURN BOOLEAN IS
  BEGIN
    dbms_output.put_line('This is function ');
    dbms_output.put_line(chr(10));
    RETURN true;
  END;

BEGIN
  dbms_output.put_line('This is the initialization section of package body');
END employee_info;
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用包的初始化部分?

如上例所示,当我第一次执行代码时,我只能看到package body的begin..end被执行,而其余的调用则不会执行.

我正在使用以下语句执行过程和函数:

 execute employee_info.p;

    declare
      p1 boolean;
    begin
      p1 := employee_info.f;
    end;
Run Code Online (Sandbox Code Playgroud)

oracle plsql initialization package

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

在Oracle表中插入随机数据

我想在Oracle表中创建随机数据:

CREATE TABLE EVENTS(
  EVENTID INTEGER NOT NULL,
  SOURCE VARCHAR2(50 ),
  TYPE VARCHAR2(50 ),
  EVENT_DATE DATE,
  DESCRIPTION VARCHAR2(100 )
)
/
Run Code Online (Sandbox Code Playgroud)

我试过这个:

BEGIN  
FOR loop_counter IN 1..1000 
LOOP 
INSERT INTO EVENTS (EVENTID, SOURCE, TYPE, EVENT_DATE, DESCRIPTION) VALUES (loop_counter, loop_counter, 'warning', 
DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J')), dbms_random.value(1,100)); 
END LOOP; 
COMMIT; 
END;
Run Code Online (Sandbox Code Playgroud)

我收到此错误异常

错误报告 - ORA-06550:第5行,第13列:PL/SQL:ORA-00932:不一致的数据类型:预期DATE得到NUMBER ORA-06550:第4行,第1列:PL/SQL:SQL语句忽略06550. 00000 - "行%s,列%s:\n%s"*原因:通常是PL/SQL编译错误.*行动:

你能告诉我如何解决这个问题吗?

sql oracle plsql oracle11g

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

如何比较PL/SQL过程中的日期?

我是SQL编程的新手.

我需要制作一个比较日期的程序.过程中唯一的参数是用户在Java程序中键入的日期.我需要检查一下这个参数(日期)是否在一年前.换句话说,我需要将它与SYSDATE减去一年进行比较.如果是这种情况,我必须"清除"与"时间表"相关的所有表格(其中有2个).

例如,假设用户输入2013-04-13,我的程序必须将它与SYSDATE进行比较 - 1年(在这种情况下,它将是2014-12-03).由于该值小于今天减去一年,因此必须清除表"MovieSchedule"和"ChannelSchedule".如果输入的日期是2014-12-16,因为它现在超过SYSDATE减去一年,该过程必须发回一个我将能够在Java程序中使用的显式错误.

现在,正如我所说,我对PL/SQL中的程序编程完全不熟悉,所以我可以通过在互联网上查找教程来提出这些内容:

CREATE OR REPLACE
PROCEDURE purge_schedule(purgeDate date) AS

DECLARE
currentDate := to_date(SYSDATE, 'YYYMMDD');

BEGIN

    -- IF purgeDate < (currentDate - 1year)
        -- delete content in "MovieSchedule" and "ChannelSchedule"
    -- ELSE
        -- return explicit error

END purge_schedule;
Run Code Online (Sandbox Code Playgroud)

我甚至不知道这是否是编写我想要的程序的正确方法.正如你所看到的,我的问题是如何在程序中实现我的条件,而不是它背后的逻辑.我责怪我缺乏语言练习.

如果您需要更多信息以帮助我,请告诉我是否需要更具体.谢谢你的帮助,祝你有个美好的一天:)

oracle plsql stored-procedures date

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

触发器在被同一表激发后无法读取该表

可以说我有一张桌子如下-

create table employees 
(
 eno      number(4) not null primary key, 
 ename    varchar2(30),
 zip      number(5) references zipcodes,
 hdate    date
);
Run Code Online (Sandbox Code Playgroud)

我使用以下代码块创建了一个触发器

create or replace TRIGGER COPY_LAST_ONO
AFTER INSERT ON ORDERS
FOR EACH ROW
DECLARE

ID_FROM_ORDER_TABLE VARCHAR2(10);

BEGIN

SELECT MAX(ORDERS.ONO)INTO ID_FROM_ORDER_TABLE from ORDERS ;
DBMS_OUTPUT.PUT_LINE(ID_FROM_ORDER_TABLE);

INSERT INTO BACKUP_ONO VALUES( VALUE1, VALUE2,VALUE3, ID_FROM_ORDER_TABLE);

END;
Run Code Online (Sandbox Code Playgroud)

触发器在插入后触发,并尝试从触发它的表中读取(逻辑上是duhh!),但是oracle给我一个错误,并要求我修改触发器,以便它不读取表。错误代码-

Error report -
SQL Error: ORA-04091: table TEST1.ORDERS is mutating, trigger/function may not see it
ORA-06512: at "TEST1.COPY_LAST_ONO", line 8
ORA-04088: error during execution of trigger 'TEST1.LOG_INSERT' …
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle11g oracle-sqldeveloper

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

pl sql中while循环出错

我使用while循环来计算Pl Sql中从1到10的整数.

这是代码:

set serveroutput on;
declare
i number := 0;
sum number := 0;
begin
while i <= 10 loop
sum := sum + i ;
i := i + 1;
end loop;
dbms_output.put_line ( sum );
end;
/
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

这是错误消息:

sum := sum + i ;
           *
ERROR at line 6: 
ORA-06550: line 6, column 12: 
PLS-00103: Encountered the symbol "+" when expecting one of the following: 
( 
ORA-06550: line 9, column 28: 
PLS-00103: Encountered the symbol ")" …
Run Code Online (Sandbox Code Playgroud)

plsql while-loop

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

Oracle PL/SQL where condition:不等于0或null

我选择的id地方不能等于0,值也不能(null).我写:

WHERE id IS NOT NULL (+) and id not in ('0')
Run Code Online (Sandbox Code Playgroud)

我有2个错误

错误(9,5):PL/SQL:忽略SQL语句

错误(38,119):PL/SQL:ORA-00933:SQL命令未正确结束我将其更改为:

WHERE id IS NOT NULL (+) and id is not ('0')  
Run Code Online (Sandbox Code Playgroud)

发生了相同的错误 我应该写什么作为WHERE条款?

plsql oracle-sqldeveloper

2
推荐指数
3
解决办法
9199
查看次数

如何在PL/SQL中使用循环多次运行相同的查询?

使用此代码,我无法多次运行插入查询; 它只询问ID和名称一次(如果计数器中的值大于1).

declare
        counter number := 0 ;
begin 
        counter := &counter ;
        while counter > 0 loop
               insert into customer values ( &id, '&name' ) ;
               counter := counter - 1 ;
       end loop ;
end ;   
Run Code Online (Sandbox Code Playgroud)

让我借助一个例子来解释: -

说我把值2放入counter.有了它,它应该问我两次ID和名称,但它只询问一次,并将我输入的ID和名称的值复制到表中test两次.

我怎样才能解决这个问题?如果我不能那么请建议替代代码来解决我的问题.

sql oracle plsql

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

如何轻松引用关联数组的索引类型?

是否有一种简单的方法可以在声明表示其键的变量时引用PLSQL中关联数组的索引类型?

我正在寻找类似于下面的语言结构.

DECLARE
  i number;
  j i%type;
BEGIN
  null;
END;
Run Code Online (Sandbox Code Playgroud)

我希望能够做那样的事情.

DECLARE
  type ty_my_type is table of number index by varchar2(4);
  my_array ty_my_type;
  -- key my_array.key%type;
  -- or
  -- key my_array%keytype;
BEGIN
  null;
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

如何使用Oracle环境中的触发器和/或过程在运行时创建外键

我有两个名为Patient and pharmacy的表.每个患者与一个药房唯一关联.我想在这些表之间的运行时创建外键约束.

Create table patient
(patient_Id varchar2(5) primary key,
patient_name varchar2(20));

Create table pharmacy
(pharmacy_Id varchar2(5) primary key,
pharmacy_name varchar2(20);

Create table patient_pharmacy_mapper
(patient_Id varchar2(5) references patient(patient_Id),
 pharmacy_Id varchar2(5) references pharmacy(pharmacy_Id));
Run Code Online (Sandbox Code Playgroud)

我不是在设计时编写"引用",而是可以在运行时创建/删除这些外键约束(当任何DML语句触发时)?

我对创建一个触发器知之甚少,我们必须使用"Alter table语句"调用一个过程.

oracle plsql

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