标签: plsql

如何在PL/SQL中使用BULK COLLECT和FORALL替换CURSOR FOR LOOP?

如何在PL/SQL中使用BULK COLLECT和FORALL替换CURSOR FOR LOOP?我想有一种更有效的方法来更新单个表中的记录.

假设我有以下PL/SQL代码:

DECLARE
   var_buy_more_shoes   inventory.buy_more_shoes%TYPE := NULL;
   var_buy_more_bananas   inventory.buy_more_bananas%TYPE := NULL;
   var_buy_more_iphone6s   inventory.buy_more_iphone6s%TYPE := NULL;

   CURSOR cur
   IS
      SELECT *
        FROM inventory
      FOR UPDATE;

BEGIN
   FOR rec IN cur
   LOOP
      IF rec.pair_of_shoes_left <= 100
      THEN
         var_buy_more_shoes := 'Yes';
      END IF;

      IF rec.weight_of_bananas_left <= 200
      THEN
         var_buy_more_bananas := 'Yes';
      END IF;

      IF rec.number_of_iphone6s_left <= 50
      THEN
         var_buy_more_iphone6s := 'Yes';
      END IF;

      UPDATE inventory a
         SET A.buy_more_shoes = var_buy_more_shoes,
             A.buy_more_bananas = var_buy_more_bananas,
             A.buy_more_iphone6s = var_buy_more_iphone6s
       WHERE CURRENT OF cur; …
Run Code Online (Sandbox Code Playgroud)

plsql for-loop forall bulk-collect

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

结果集变量或查询的PL/SQL返回类型不匹配

我正在尝试使用GET存储过程/光标来显示我在彩票游戏数据库中创建的彩票游戏桌的游戏名称.

这是代码:

CREATE OR REPLACE PROCEDURE GetLotteryGameName (
  p_lgid IN NUMBER,
  p_value out VARCHAR2,
  p_field IN VARCHAR2
)
IS
BEGIN
  SELECT GAMENAME
  INTO p_value
  FROM LOTTERYGAME
  WHERE LOTTERYGAMEID = p_lgid;
END GetLotteryGameName;

CREATE OR REPLACE PACKAGE GETLOTTERYGAMENAMEPKG IS
  PROCEDURE GetLotteryGameName (
    p_lgid IN NUMBER,
    p_value out VARCHAR2,
    p_field IN VARCHAR2
  );

  TYPE per_ref_cursor IS REF CURSOR;
  PROCEDURE GetGameName (p_lgid IN NUMBER, p_ref OUT per_ref_cursor);

END GETLOTTERYGAMENAMEPKG;

CREATE OR REPLACE PACKAGE BODY GETLOTTERYGAMENAMEPKG IS
  PROCEDURE GetLotteryGameName (
    p_lgid IN NUMBER,
    p_value …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

Oracle SQL Developer - 使用脚本创建函数

[解释]
如果我想创建一个属于模式'A'的函数,我的理解是我需要在模式'A'中创建包,并实现函数.(如果还有其他办法,请纠正我).
如果我试图使用脚本文件创建一个函数(例如.新图库 - > SQL文件(数据库文件)来创建untitled.sql),我会感到困惑,因为该函数不属于任何模式,它将被存储在全球.

[问题]
1)如何创建函数属于使用脚本的模式'A'?
2)存储在全局的函数无法访问模式表,我该如何解决?

在此输入图像描述

sql oracle plsql oracle-sqldeveloper

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

如何在PL/SQL中使用序列查找父表?

select SEQUENCE_OWNER, SEQUENCE_NAME from ALL_SEQUENCES 
Run Code Online (Sandbox Code Playgroud)

我们假设上面的代码会给我以下结果.

<Table Name: ALL_SEQUENCES> 
SEQUENCE_OWNER      SEQUENCE_NAME 
schema1             table1_name_seq       
schema1             table2_name_seq       
schema2             table1_name_seq   
Run Code Online (Sandbox Code Playgroud)

我很确定每个序列都有一个对应的父表,序列用于该表.所以,我想使用sequence_name找到父表.例如,如果我知道具有序列所有者schema1的序列名table1_name_seq,我应该找到表名schema1.table1.

建议不要使用SUBSTRING或REPLACE函数重新格式化字符串,因为sequence_name不遵循"良好一致的命名标准",我无权更改它.

我找不到有关此事的任何信息.非常感谢您的帮助!

sql oracle plsql

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

在PL/SQL中的触发器中获取事件信息

我在Oracle中有一个触发器,它在特定表上插入或更新时被触发.在触发器内部,我想确定触发触发器的事件(无论是插入还是更新?).如何确定PL SQL中的事件信息?

oracle plsql

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

ORA-19011:字符串缓冲区太小

我写了一个存储过程SP_DEMAND_QRY.如果表中只有几个匹配的行(5或6),则会生成正确的值Demand.但是如果该表包含更多匹配的行(> 6),那么当我执行它时会出现此错误:

Error:
-------
ORA-19011: Character string buffer too small
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)

程序是:

create or replace PROCEDURE SP_DEMAND_QRY 
    (
      USR IN VARCHAR2  
    , OUT_CLOB OUT CLOB  
    ) AS 
BEGIN
    SELECT to_clob(XMLElement("DEMANDS",XMLAgg(XMLElement("Demand"
               ,XMLElement("DemandId",dmnd_id)
               ,XMLElement("CreatedBy",CREATED_BY)
               ,XMLElement("CreatedDate",CREATED_DATE)
               ,XMLElement("Designation",DESIGNATION)
               ,XMLElement("Experience",EXPERIENCE)
               ,XMLElement("PrimarySkill",PRIMARY_SKILL)
               ,XMLElement("SecondarySkill",SECONDARY_SKILL)
               ,XMLElement("OtherSkill",OTHER_SKILL)
               ,XMLElement("RequiredDate",REQUIRED_DATE)
               ,XMLElement("ProbablePercentage",PROBABLE_PERCENTAGE)
               ,XMLElement("CriticalFlag",CRITICAL_FLG)
               ,XMLElement("AssignedFlag",ASSIGNED_FLG)
               ,XMLElement("AccountName",ACCOUNT_NAME)
               ,XMLElement("OpportunityName",OPTY_NAME)
               ,XMLElement("AccountPOC",ACCNT_POC)
               ,XMLElement("COE",COE)
               ,XMLElement("DemandType",DEMAND_TYPE)
               ,XMLElement("Location",LOC)
               ,XMLElement("ExpectedRole",EXPECTED_ROLE)
               ,XMLElement("ConfidenceFactor",CONFIDENCE_FACTOR)
               ,XMLElement("EndDate",END_DT)
               ,XMLElement("HiringSO",HIRING_SO)
               ,XMLElement("HiringSOId",HIRING_SO_ID)
               ,XMLElement("Comments",COMMENTS)
           )))) 
    into OUT_CLOB
    from demand s
    where s.CREATED_BY=usr;
    --DBMS_output.put_line(OUT_CLOB);
END SP_DEMAND_QRY;
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

oracle plsql

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

嵌套数组和关联数组有什么区别?

有两个链接 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99981和

在Oracle中使用不同类型的PL / SQL集合的目的

通过引用以上两个链接,我有两个疑问

1.哪个是正确的嵌套表?

2.如果oracle文档是正确的,嵌套表和关联数组有什么区别?

sql oracle plsql associative-array nested-table

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

在PLSQL中授予UTL_HTTP权限

我想从我的函数中的某个网页获取HTML内容。我读过我可以用PLSQL中的UTL_HTML包来做到这一点。因此,我在项目中编写了以下代码:

v_webcontent := utl_http.request(v_weblink);
Run Code Online (Sandbox Code Playgroud)

在此先声明了v_webconent和v_weblink。在功能中运行此命令会导致PLSQL异常:PLS-00201: identifier 'UTL_HTTP' must be declared我想这个问题是因为该软件包不可用(来自此链接:相同的错误消息)。

我听从了建议。因此,我以SYSTEM角色的身份在sql developer中创建了一个新的数据库连接(SYS无法正常工作,它说我只能使用SYSDBA或SYSOPER登录,但两者都不会采用我在数据库中创建的标准密码)。然后,我在上面的链接中输入了代码。

GRANT EXECUTE ON SYS.UTL_HTTP TO [database];
Run Code Online (Sandbox Code Playgroud)

我创建的用户名为“数据库”。它首先给我一个没有[]方括号的错误。表格或视图不存在,因此我将其放在方括号中。现在它给出了错误:

    Error starting at line : 1 in command -
GRANT EXECUTE ON SYS.UTL_HTTP TO [database]
Error report -
SQL Error: ORA-00987: missing or invalid username(s)
00987. 00000 -  "missing or invalid username(s)"
*Cause:    
*Action:
Run Code Online (Sandbox Code Playgroud)

所以我不知道如何解决这个问题。在上面的链接中,OP说他还有另一个错误,因此我还检查了我是否没有同样的问题。我进入了:

SELECT * FROM dba_objects WHERE object_name='UTL_HTTP'
Run Code Online (Sandbox Code Playgroud)

它返回了4个条目。与所有者:SYS,SYS,PUBLIC和APEX_040000。

有人可以帮我吗?我需要以SYS身份登录并且使用什么密码?

settings plsql reserved-words oracle-sqldeveloper

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

Oracle:处理NULL值的最佳方法

我在一个过程中有这段代码:

 if val is NULL
    then 
    creb :=0;
   else 
     creb := val;
 end if;
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方式来处理null?

oracle plsql

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

Oracle中的动态DBLink

我正在尝试通过在运行时确定的DBLink运行一组查询(来自配置或其他输入).我见过许多建议使用动态SQL和EXECUTE IMMEDIATE的例子.我想不惜一切代价避免这种情况,因为我的查询冗长且可能会发生变化,因此将它们放在字符串中会使维护变得更加困难.

我尝试让我的查询引用同义词,然后在执行查询之前更新同义词:

EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM my_tbl_s FOR my_tbl_t' || p_dblink_name;

SELECT * FROM my_tbl_s;
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想在一个包中使用它,所以当我执行create synonym时,包无效.我也试过将我的代码分成不同的包并在同义词更新后重新编译:

EXECUTE IMMEDIATE 'ALTER PACKAGE my_pck COMPILE';   
Run Code Online (Sandbox Code Playgroud)

但是,原始调用包仍然无效.谁能想到一种在不使用动态SQL的情况下实现动态DB链接的方法?

oracle plsql dblink oracle10g

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