标签: plsql

从Oracle SQL*Plus中执行函数时行为不一致?

我是Oracle和SQL的新手,我正在尝试从SQL*Plus中执行一个简单的测试函数.我的函数叫做tf(用于测试函数),它在一个名为tf.sql的文件中定义如下;

create or replace
function
tf
(
 arg1 in varchar2
)
return number

as

return_value number;

begin

return_value := 0;
dbms_output.put_line('Argument 1 = ' || arg1);
return return_value;

end;
/
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令成功将此函数加载到Oracle中;

SQL> start ./tf.sql
Run Code Online (Sandbox Code Playgroud)

执行此命令后,SQL*Plus只会说明;

Function created.
Run Code Online (Sandbox Code Playgroud)

然后我从SQL*Plus命令提示符执行以下命令(在我调用set serveroutput on之后);

SQL> exec dbms_output.put_line(SYSTEM.TF('Hello'));
Run Code Online (Sandbox Code Playgroud)

我得到以下输出;

Argument = Hello
0

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试直接从SQL*Plus命令提示符执行我的函数,请使用以下命令;

SQL> exec SYSTEM.TF('Hello');
Run Code Online (Sandbox Code Playgroud)

然后我收到来自SQL*Plus的以下错误消息;

BEGIN SYSTEM.TF('Hello'); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00221: 'TF' is not a procedure or is undefined
ORA-06550: …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql function

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

在PL/SQL中使用"select*"作为游标被认为是错误的编程?

我通常以这种方式使用游标:

for rec in (select * from MY_TABLE where MY_COND = ITION) loop
    if rec.FIELD1 = 'something' then
        do_something();
    end if;

    if rec.FIELD2 <> 'somethingelse' then
        blabla();
    end if;
end loop;
Run Code Online (Sandbox Code Playgroud)

我的团队负责人告诉我不要使用select *因为编程不好,但我不明白为什么(在这种情况下).

database oracle plsql

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

尝试调用程序时PLS-00103

尝试编译时,我收到以下错误

错误(16,8):PLS-00103:遇到以下其中一项时遇到符号"SPROLLUPEXPENSEITEM":: =.(@%;符号":="代替"SPROLLUPEXPENSEITEM"继续.

和

错误(17,15):PLS-00103:当遇到以下情况之一时遇到符号"=":. (*@%= - + </>在是模余数不那么REM <>或=或〜=> = <= <>和或类似的多集||构件SUBMULTISET之间LIKE2样4 likec!

create or replace
TRIGGER tr_ExpenseItem_Rollup
AFTER DELETE OR UPDATE of ExpApprAmt
ON ExpenseItem
FOR EACH ROW
DECLARE
    RollupAmt   Number;
    BlnResult   Boolean;
BEGIN
    IF DELETING THEN
        RollupAmt := -1 * :Old.ExpApprAmt;
    End If;
    IF UPDATING Then
        RollupAmt := :New.ExpApprAmt - :Old.ExpApprAmt;
    End IF;
  Call spRollUpExpenseItem(:New.ERNo,:New.ECNo,RollupAmt,BlnResult);
    If BlnResult := TRUE
        --Additional Logic Here 
    End IF;
END;
Run Code Online (Sandbox Code Playgroud)

我是一名学生而且很新,所以任何帮助都会受到赞赏.

oracle triggers plsql pls-00103

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

pl/sql中是否有BEFORE SELECT触发器?

您好我使用sqldeveloper连接到oracle数据库.

我的senario是我的数据库中有一个客户表,start_date其中包含一个日期字段,该字段包含用户注册日期和调用的"布尔"字段is_member.每个会员资格仅持续一年,is_member如果是,则为假SYSDATE > start_date + 1year.

我想is_member在用户调用select语句之前检查用户是否仍然是成员(如果没有则更改).这可能吗?

如果没有人有任何关于如何保持该is_member领域最新的想法?你可以做一个每天调用一次的触发器来查看会员资格是否已经过期?

谢谢你的推荐!=]

sql oracle triggers plsql

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

是否可以在Oracle PL/SQL中执行此操作?

我有一个TABLE1带有列NUMBER(8)和列的常规表varchar2(100).

现在我创建了一个OBJECT TYPE T_MYTYPE有两个属性:一个NUMBER和另一个varchar2.

简而言之,它们完全相同.

现在我想做以下事情.

v_obj T_MYTYPE;

begin 
 select * into v_obj from TABLE1 t1 where t1.num = 9;--guaranteed to return only ONE row!!
end;  
Run Code Online (Sandbox Code Playgroud)

但是PL/SQL:ORA-00947:值不够 ..

这是很令人沮丧......我只是希望能够返回ONE一行数据到一个集合!无论是记录还是对象类型!!,我不在乎......我似乎无法做出这项工作...... !!!! 谁能帮忙?

sql oracle plsql oracle11g

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

如何使用嵌套的对象类型表创建Oracle表?

我有一个高度嵌套的OBJECT TYPE结构,允许我以树状方式保存数据.

我现在想创建一个表来缓存这些对象,但是我很难创建表.我怀疑我的问题是多个嵌套级别,但不确定如何修复.

CREATE TYPE STEP_OBJ AS OBJECT (
  ID                        VARCHAR2(20),
  OTHER_FIELDS              VARCHAR2(100));
/

CREATE TYPE STEP_TAB_OBJ AS TABLE OF STEP_OBJ;
/

CREATE TYPE TREE_OBJ AS OBJECT (
  STEPS       STEP_TAB_OBJ,
  COMPLETE    VARCHAR2(1));
/

CREATE TYPE TABLE_OF_TREE_OBJ AS TABLE OF TREE_OBJ;
/

CREATE TABLE TREE_TABLE_CACHE (
   HANDLE               VARCHAR2(20),
   TABLE_OF_TREES       TABLE_OF_TREE_OBJ)
   NESTED TABLE TABLE_OF_TREES STORE AS TREE_TABLE_CACHE_OBJS;
/

CREATE TABLE TREE_TABLE_CACHE (
*
ERROR at line 1:
ORA-02320: failure in creating storage table for nested table column TABLE_OF_TREES
ORA-22913: must specify table …
Run Code Online (Sandbox Code Playgroud)

oracle plsql user-defined-types oracle11g

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

我们可以在PL/SQL中的函数内调用过程吗?

我们可以在程序里面调用函数,但是可以在函数内部调用程序吗?我试过但我不能在函数内部调用程序.你能告诉我为什么我们不能调用函数内的程序吗?

oracle plsql stored-procedures function oracle10g

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

似乎找不到循环PL/SQL数组的方法?

我想这样做:

arrCauses := APEX_UTIL.STRING_TO_TABLE(:P1_CAUSE);
FOR c IN 1..arrCauses.count LOOP
  INSERT INTO DT_EVENT_CAUSE (
  EVENT_ID,
  CAUSE_ID)

  VALUES (
  nextPK, c);
END LOOP;
Run Code Online (Sandbox Code Playgroud)

或这个

arrCauses := APEX_UTIL.STRING_TO_TABLE(:P1_CAUSE);
FOR c IN arrCauses.first..arrCauses.last LOOP
  INSERT INTO DT_EVENT_CAUSE (
  EVENT_ID,
  CAUSE_ID)

  VALUES (
  nextPK, c);
END LOOP;
Run Code Online (Sandbox Code Playgroud)

问题是... c总是只是计数,所以如果数组是1项,则会插入1的ac.如果数组中有3个项目,则将插入c的1,2和3.与数组中的实际值相反.我究竟做错了什么?!

sql database plsql

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

将数据从Oracle表传输到文本文件

我感兴趣的是PL/SQL块可以将Oracle表的内容传输到硬盘上的文本文件中.我需要一个PL/SQL块,它可以下载一个表的内容,用于将日志数据存储到文本文件中.

问候

sql oracle plsql oracle11g

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

PL/SQL过程字符参数

这很可能是一个非常愚蠢的问题,但我已经尝试过搜索并回答空洞.

我正在编写一个采用CHAR类型参数的过程.即:

  CREATE PROCEDURE Proc1 (Param1 CHAR(5))
  AS
  BEGIN
    ...
  END;
Run Code Online (Sandbox Code Playgroud)

这不起作用,并在CHAR(5)区域周围抛出错误.如果我没有为参数指定大小,那么只需将其保留为CHAR它就可以正常工作.我尝试过包含关键字IN,但这并没有什么区别.

无论如何在PL/SQL过程中指定参数的大小?

sql plsql stored-procedures procedure oracle10g

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