标签: plsql

批量收集到表类型的对象中

尝试使用对象表的BULK COLLECT语句时出错ORA-00947: not enough values。

线路发生错误 from (select jta.nobject_id,

CREATE OR REPLACE TYPE "T_PPW_WORK"  as object                                     
    (          
      nObjectKey   number,  
      cJobType     varchar2(500),  
      dPlanStart   date,
      dPlanEnd     date,
      cExecutor    varchar2(500),
      cComment     varchar2(4000)
    )

    CREATE OR REPLACE TYPE "T_PPW_WORK_TABLE" as table of T_PPW_WORK;                                         


      function getPlannedOverdueJobs(in_nPlanKey number) return T_PPW_WORK_TABLE is
        l_oWorks T_PPW_WORK_TABLE;    
        l_oWork T_PPW_WORK;    
      begin

        select * bulk collect
          into l_oWorks
          from (select jta.nobject_id,
                       jt.cjobtype_name,                           
                       jta.dactual_start,
                       jta.dactual_finish,
                       st.familiya,
                       jta.ccomment
                  from ppw_jobtype_assign jta
                  left join pgts_sotrudnik st
                    on jta.nworkerid = st.npgts_sotrudnikkey
                  join …
Run Code Online (Sandbox Code Playgroud)

oracle plsql object-type bulk-collect

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

如何制作数据库包的副本

我有一个包(可能很多),我想将其复制到具有不同名称的新包中。

理想情况下,我想运行这个:

begin
  copy_package('MY_PACKAGE_NAME','MY_PACKAGE_NAME$BK');
end;
/
Run Code Online (Sandbox Code Playgroud)

这将找到名为 的包MY_PACKAGE_NAME,并创建/替换一个名为 的新包,MY_PACKAGE_NAME$BK其中所有引用MY_PACKAGE_NAME(如果有)也已更改。

假设包名称不区分大小写是合理的,并且源中对包名称的任何引用都将全部为大写或全部小写(即My_Package_Name源中不会有任何引用)。

oracle plsql

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

从 pl/sql 函数返回常量值时哪种方式更好?

我正在处理一个现有的包,我发现了一个这样的功能;

   FUNCTION get_lang
      RETURN VARCHAR2
   AS
      l_ret_lang   VARCHAR2 (10);
   BEGIN
      SELECT 'US' LANGUAGE
        INTO l_ret_lang
        FROM DUAL;

      RETURN l_ret_lang;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         l_ret_lang := ' ';
         RETURN l_ret_lang;
      WHEN OTHERS
      THEN
         l_ret_lang := SUBSTR (SQLERRM, 1, 100);
         RETURN l_ret_lang;
   END;
Run Code Online (Sandbox Code Playgroud)

定义这样的函数是否有任何合乎逻辑的理由,定义如下更简单的版本不是更好吗?

  FUNCTION get_lang
  RETURN VARCHAR2
   AS
      l_ret_lang   VARCHAR2 (10):= 'US';
   BEGIN

      RETURN l_ret_lang;

   END;
Run Code Online (Sandbox Code Playgroud)

还从双表达式中选择可以引发异常吗?

oracle plsql

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

从不同的模式调用包内的 Oracle 过程?

我用 3 个程序创建了以下包:

CREATE OR REPLACE PACKAGE PQ_PaqueteIntegrantes
AS 
PROCEDURE INTEG_INSERCIONES(paIdIntegrante IN CreadorTablas.INTEGRANTES.ID_INTEGRANTE%TYPE 
                           ,paNombre IN CreadorTablas.INTEGRANTES.NOMBRE%TYPE
                           ,paApellidoPaterno IN CreadorTablas.INTEGRANTES.APELLIDO_PATERNO%TYPE);

PROCEDURE INTEG_MODIFICACIONES(paIdIntegrante IN OUT CreadorTablas.INTEGRANTES.ID_INTEGRANTE%TYPE 
                              ,paNombre IN OUT CreadorTablas.INTEGRANTES.NOMBRE%TYPE
                         ,paApellidoPaterno IN OUT CreadorTablas.INTEGRANTES.APELLIDO_PATERNO%TYPE);

PROCEDURE INTEG_ELIMINCACIONES( 
               paIdIntegrante    IN OE.EJEMPLO_TRANSAC_CLASE.CUSTOMER_ID%TYPE
                                ,paMjeDescError OUT VARCHAR2
                                ,paCodeError    OUT NUMBER);             
END PQ_PaqueteIntegrantes;
Run Code Online (Sandbox Code Playgroud)

我使用名为Admin_proyectos的用户创建了这些过程。第一个过程制作“插入”,第二个“更新”,最后一个“删除”,所有这些都在一个名为Integrantes的表上工作,该表来自另一个名为CreadorTablas 的用户。我的目的是创建另一个名为Admin 的用户,当然,他将负责使用这个包中的过程来做这些事情。我试过做一个 PL/SQL 块,但它不起作用,无论是 EXEC。

sql oracle plsql procedures

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

Oracle PLSQL BULK 收集和 For 循环

我编写了以下 oracle 程序来批量获取数据并分块处理。我正在使用有限制的批量收集选项来获取数据。但是在 for 循环中,我无法检索 ORD_ID。我正在尝试使用输出 ORD_ID

DBMS_OUTPUT.put_line(l_orders(indx)); 
Run Code Online (Sandbox Code Playgroud)

但是出现编译错误“调用'PUT_LINE'的参数数量或类型错误”

create or replace PROCEDURE TESTPROC AS 

CURSOR order_id_cur IS SELECT ORD_ID FROM orders ORDER BY ORD_ID ASC;
 l_order_id   VARCHAR2(100);
 TYPE orders_aat IS TABLE OF order_id_cur%ROWTYPE;
 l_orders orders_aat;
 limit_in NUMBER      :=10; 
 batch_in NUMBER :=0;


BEGIN
  OPEN order_id_cur;
  LOOP
    FETCH order_id_cur 
        BULK COLLECT INTO l_orders LIMIT limit_in;
    DBMS_OUTPUT.put_line('Batch-----'||batch_in);
    FOR indx IN 1 .. l_orders.COUNT 
    LOOP
        DBMS_OUTPUT.put_line(indx);
        DBMS_OUTPUT.put_line(l_orders(indx));
    END LOOP;

    EXIT WHEN l_orders.COUNT < limit_in;
    batch_in := batch_in+1;
   END LOOP;
   CLOSE order_id_cur;
END TESTPROC; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bulk-collect

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

从 Shell 脚本执行 PL SQL 过程

嗨,我正在尝试从我的 Shell 脚本执行 PL SQL 过程并获取返回值(输出值),但它不起作用。谁能建议我做错了什么?这是我所拥有的:

output="$(sqlplus -S user/pw@//ip:1521/db <<ENDOFSQL
set serveroutput on;
DECLARE
    v_return PLS_INTEGER;
BEGIN
    PKG.Procedure(v_return);
    DBMS_OUTPUT.PUT_LINE(v_return);
END;
exit;
ENDOFSQL)"

echo $output 
Run Code Online (Sandbox Code Playgroud)

unix bash shell plsql

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

合并 PL/SQL 块中的两个表

我有接下来的 3 个表:

  • Fibonacci(id, value) 前 1000 个斐波那契数。
  • Prime(id, value) 前 2000 个素数。
  • FiboPrime(value, prime),最初表是空的。

我必须用斐波那契表中的质数填充 FiboPrime 表(质数=1 => 数字是质数,否则数字不是质数。)

我必须使用 MERGE 语句,它是尝试:

DECLARE

    BEGING
        MERGE INTO FiboPrime fp
         USING fibonacci f, prime p
         ON (f.value=p.value)
        WHEN MATCHED THEN
         UPDATE SET
          fp.value=f.value,
          fp.prime=1;
    WHEN NOT MATCHED THEN
     INSERT VALUES(f.value,0);
END;
Run Code Online (Sandbox Code Playgroud)

我收到下一个错误:当期望出现以下情况之一时,出现符号“INTO”: := .( @ ; not null range character。谁能帮我解决这个问题?

sql oracle plsql sql-merge

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

“ORA-00942: 表或视图不存在”仅在存储过程中运行时

对于 PL-SQL 人员来说,这应该很容易选择。在将此问题标记为重复之前,请确保虽然错误消息可能很常见,但潜在问题与上一个问题相同。如果是这样,请提供指向已解决的确切逻辑重复问题的链接。一世

当我登录到我的模式时,我执行以下 PL-SQL 代码:

DECLARE
  v_rpt_per_key NUMBER := 0;
BEGIN

  SELECT MAX(rpt_per_key)
  INTO v_rpt_per_key
  FROM rxfinods_sta.hd_invc_ln_item_dtl_stat;

  dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);

END;
/
Run Code Online (Sandbox Code Playgroud)

查询成功执行,最大值RPT_PER_KEY写入 Toad 中的输出窗口。

但是,当我在一个过程中执行基本相同的代码时。

CREATE OR REPLACE PROCEDURE hd_purge_test
IS
  v_rpt_per_key NUMBER := 0;
  BEGIN

    SELECT MAX(stat.rpt_per_key)
    INTO v_rpt_per_key
    FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
    --HD_INVC_LN_ITEM_DTL_STAT        

    dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);

    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      NULL;
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
      RAISE;
  END hd_purge_test;
Run Code Online (Sandbox Code Playgroud)

我收到表不存在的错误。

[Warning] ORA-24344: success with compilation error
14/21   PL/SQL: ORA-00942: …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures ora-00942

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

立即执行 oracle 字符串连接问题

我在连接要立即执行的字符串时遇到问题。任何人都知道下面的陈述有什么问题。

EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';

select smtpserver into SMTPServer from mytable;

if(SMTPServer is not null)
then
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';
  --*****above does not work, below does work****
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''10.1.1.1''';
Run Code Online (Sandbox Code Playgroud)

oracle plsql concatenation execute utl-mail

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

如何在 PL/SQL Developer 中轻松检查函数的返回值

完全是数据库新手。现在我创建了一个返回 NUMBER 的函数,我只想检查这个函数的结果。我使用的工具是 PL/SQL Developer,但我找不到输出窗口或其他任何东西。当然,在这种情况下,我不想在任何表中写入任何内容。作为 C++/C# 开发人员,我发现学习如何开发 PL/SQL 有点困难。我什至不能轻易看到我的函数的编译错误。

oracle plsql oracle11g plsqldeveloper

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