AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题

问题[plsql](coding)

Martin Hope
Zahrada
Asked: 2025-02-18 22:54:15 +0800 CST

为什么 PL/SQL 包状态没有重置?

  • 6

当抛出 ORA 时,我遇到了包初始化状态的奇怪行为。这是我在 Oracle 12c 上运行的示例:

create or replace package pkg is
   v_num number := pkg_two.getnum_two;
   function getnum return number;
end;

create or replace package pkg_two is
   v_num_two number := 1;
   
   function getnum_two return number;
end;

create or replace package body pkg is
   function getnum return number is
   begin
      return v_num;
   end;
end;

create or replace package body pkg_two is
   function getnum_two return number is
   begin
      return v_num_two;
   end;
begin
   dbms_lock.sleep(10);
end;

现在出现了奇怪的行为。我在 SQLPlus 中运行以下代码,并在 5 秒后中断它:

declare
   v_number number;
begin
   select pkg.getnum into v_number from dual;
   dbms_output.put_line('output: ('||v_number||')');
end;

此中断抛出了 ORA-01013。然后我再次运行它,仅几毫秒后我就得到了:

output: ()

这很奇怪,因为在 12c 中,只有在初始化完成后才应将包设置为初始化,正如我在本文中发现的那样:https://rogertroller.com/2018/05/16/package-initialization-changes-between-oracle-11g-and-oracle-12c/

同样奇怪的是,如果我用“:=”替换“SELECT INTO”,则行为正如文章所述:

declare
   v_number number;
begin
   v_number := pkg.getnum;
   dbms_output.put_line('output: ('||v_number||')');
end;

因此,在执行两次相同的运行程序后,我得到(第二次运行后 10 秒):

output: (1)

有人能解释一下这种行为是否是预期的吗?如果是,不使用“SELECT INTO”子句是否会发生这种情况?

plsql
  • 1 个回答
  • 39 Views
Martin Hope
Abdullah
Asked: 2025-02-11 19:38:10 +0800 CST

在 Oracle 表中插入时如何避免重复记录?

  • 5

我有 Apex 应用程序,插入时出现重复项,

如何避免重复行

这是代码:

DECLARE
      CURSOR p1 IS
        SELECT DISTINCT 
            sd.TEST_NO,
            b.TEST_NAME_ENG,
            a.PATIENT_NO,
            a.ORDER_ID,
            sd.SAMPLE_ID,
            a.SECTION_ID,
            b.SAMPLE_TYPE,
            b.TEST_CONTAINER,
            b.TEST_VOLUME,
            a.SAMPLE_STATUS,
            a.CUST_NO,
            DECODE(o.ORDER_PRIORITY, 1, 'URGENT', 2, 'ROUTINE') AS ORDER_PRIORITY , 
            p.TEST_NAME,p.REFERENCE_RANGE, p.TEST_UNIT , p.SERIAL
        FROM 
            LAB_SAMPLE_HEADER a,
            LAB_TESTS b,
            LAB_SAMPLE_DETAILS sd,
            LAB_ORDERS o , 
            LAB_TEMPLATE_DETAILS p 

        WHERE 
            sd.TEST_NO = b.TEST_NO
            AND a.ORDER_ID = o.ORDER_ID
            AND sd.ORDER_ID = o.ORDER_ID
            AND a.ORDER_ID = sd.ORDER_ID
            AND a.SAMPLE_ID = sd.SAMPLE_ID
            AND a.PATIENT_NO = :P60_MRN 
            AND sd.TEST_NO = p.TEST_NO 
            AND a.order_id = :P60_ORDER
            AND B.TEST_NO IN (
                SELECT REGEXP_SUBSTR(:P60_TEST_NO, '[^,]+', 1, LEVEL) AS TESTNO
                FROM DUAL
                CONNECT BY LEVEL <= REGEXP_COUNT(:P60_TEST_NO, ',') + 1
            );


    CURSOR para_tests(p_test_no IN NUMBER) IS
    select TEST_NO,TEST_NAME,REFERENCE_RANGE, TEST_UNIT , SERIAL
    from LAB_TEMPLATE_DETAILS para 
    where para.test_no = p_test_no;
  
   v_profile_exists number; -- Variable to check if the TEST_NO belongs to a profile
   v_para_exists number; -- Variable to check if the TEST_NO belongs to a parasitology
BEGIN
    
    FOR i IN p1 LOOP
             -- Check if the current TEST_NO is part of a template
        SELECT COUNT(*) INTO v_para_exists
        FROM LAB_TEMPLATE_DETAILS
        WHERE test_no = i.TEST_NO;
        
        IF v_para_exists > 0 THEN
            -- TEST_NO is part of a parasitology, insert only parasitology tests
            FOR p IN para_tests(i.TEST_NO) LOOP
                INSERT INTO LAB_PARA_RESULTS
                (
                    ORDER_ID, SAMPLE_ID, PATIENT_NO, TEST_NO, TEST_NAME, TEST_RESULT , REFERENCE_RANGE , 
                    TEST_UNIT , SERIAL , EXAMINED_BY, EXAMINED_DATE, APPROVED_BY, APPROVED_DATE, CUST_NO , SAMPLE_STATUS ) 
                    VALUES (
                    i.ORDER_ID, -- ORDER_ID from cursor
                    i.SAMPLE_ID, -- SAMPLE_ID from cursor
                    i.PATIENT_NO, -- PATIENT_NO from cursor
                    p.TEST_NO, -- TEST_NO from para 
                    i.TEST_NAME ,
                    NULL , 
                    i.REFERENCE_RANGE , 
                    i.TEST_UNIT , 
                    i.SERIAL , -- SERIAL
                    NULL , -- EXAMINED_BY
                    NULL, -- EXAMINED_DATE
                    NULL, -- APPROVED_BY
                    NULL , -- APPROVED_DATE 
                    i.CUST_NO, -- CUST_NO from cursor
                    3 -- SAMPLE_STATUS
                                       
                );
            END LOOP;
            end if;
         END LOOP;
         
    COMMIT; -- Commit the transaction
END;

游标 p1 返回正确的行数且无重复

游标 para_tests 也返回正确的数字,没有重复

但插入行时会重复

例如,游标 p1 返回 10 行,但插入时每行重复 10 次,总共 100 行。

插入 LAB_PARA_RESULTS 时如何避免循环中出现重复?

plsql
  • 1 个回答
  • 30 Views
Martin Hope
NablaDelta
Asked: 2024-11-05 19:49:30 +0800 CST

从对象或表类型声明记录类型

  • 5

我在数据库中创建了一个对象类型,并想在包中声明一个记录类型,以便使用引用游标循环提取数据,但这似乎不适用于对象类型。如何在不创建虚拟表的情况下实现这一点?我想使用如下所示的on可能会奏效,但我不知道该怎么做。type_objecttype_record%ROWTYPEtype_table

/* type_object has been created before */

declare
    type type_table is table of type_object;
    l_rec         type_table%ROWTYPE; -- doesn't work
    l_refcursor   sys_refcursor;
begin
    open l_refcursor for 'select * from mytable';
    loop
      fetch l_refcursor into l_rec;
      exit when l_refcursor%notfound;
      -- do something with l_rec
    end loop;
    close l_refcursor;
end;
plsql
  • 1 个回答
  • 33 Views
Martin Hope
Het Shukla
Asked: 2024-10-02 18:41:31 +0800 CST

PL/SQL 块内的 SQL 查询无法正常工作,获取所有数据并忽略 WHERE 子句

  • 5

我从过去 2 个小时开始调试这个问题,但我无法找到解决方案,请帮帮我......

问题就在这里...

我已经创建了一个名为“EMPP”的表

`CREATE TABLE EMPP(
  EMPNO NUMBER PRIMARY KEY,
  ENAME VARCHAR2(15),
  JOB VARCHAR2(15),
  SAL NUMBER(7,2)
)`

现在我已在其中插入 1 条记录...

INSERT INTO EMPP VALUES(1, 'A','B',2850);

如果我获取所有记录,那么正如预期的那样,我只会获得 1 条记录......

输出

现在我需要解决这个问题,“创建一个 PL/SQL 块,打印给定员工薪水的员工详细信息。如果有多个员工的薪水相似,则在终止块之前打印适当的用户定义消息。”

以下是我对这个问题的解答

`DECLARE
same_sal EXCEPTION;
sal EMPP.SAL%TYPE := :Enter_Salary;
no EMPP.EMPNO%TYPE;
ename EMPP.ENAME%TYPE;
job EMPP.JOB%TYPE;
total_row NUMBER;
BEGIN
SELECT COUNT(*) INTO total_row FROM EMPP WHERE SAL = sal;
    dbms_output.put_line(sal);
IF (total_row > 1) THEN
    raise same_sal;
ELSE
    SELECT EMPNO, ENAME, JOB INTO no, ename, job FROM EMPP WHERE SAL = sal;

    dbms_output.put_line('No :  ' || no);
    dbms_output.put_line('Emp Name :  ' || ename);
    dbms_output.put_line('Job :  ' || job);
END IF;

EXCEPTION
WHEN same_sal THEN
    dbms_output.put_line('There are more than 1 employee with same salary');
END;`

现在主要问题从这里开始,无论我在绑定变量“sal”中插入什么,它都会返回记录,例如,如果我在 sal 变量中添加“100”,它仍然会返回工资为 2850 的记录。

在变量中插入值

输出

我不知道我做错了什么,我试图直接执行查询......

`SELECT COUNT(*) FROM EMPP WHERE SAL = 2850;  -- returns 1
SELECT COUNT(*) FROM EMPP WHERE SAL = 100;   -- returns 0
SELECT COUNT(*) FROM EMPP WHERE SAL = 1000;  -- returns 0`

注:我正在使用 Oracle 10g

plsql
  • 1 个回答
  • 20 Views
Martin Hope
APR
Asked: 2024-06-19 21:51:42 +0800 CST

比较游标值是否存在于另一个游标中 - oracle plsql

  • 5

我有两个要比较的游标。如果游标 1 存在于游标 2 的所有行中,我会比较游标 1。我尝试了以下操作,但似乎在第一次匹配时就停止了。

  CURSOR cursor1 IS
  SELECT col1, col2 FROM table1;
  CURSOR cursor2 IS
  SELECT col1, col3 FROM table2;
  c1_rec cursor1%ROWTYPE;
  c2_rec cursor2%ROWTYPE;
BEGIN
  OPEN cursor1;
  OPEN cursor2;
  LOOP
    FETCH cursor1 INTO c1_rec;
    FETCH cursor2 INTO c2_rec;
    EXIT WHEN cursor1%NOTFOUND OR cursor2%NOTFOUND; 

    IF c1_rec.col1 = c2_rec.col1 OR c1_rec.col2 = c2_rec.col3 THEN
      DBMS_OUTPUT.PUT_LINE('Match in row: ' || SQL%ROWCOUNT);
    END IF;
  END LOOP;
  CLOSE cursor1;
  CLOSE cursor2;
END;
/
plsql
  • 1 个回答
  • 15 Views
Martin Hope
Dito
Asked: 2024-03-07 02:27:25 +0800 CST

匿名块中的 PL/SQL 记录类型

  • 5

我想要一个函数为我的程序返回多个值。所以我编写了一个以记录类型返回值的函数。我可以毫无问题地编译该包。当从代码调用时它也运行良好。但是当我使用匿名块来检索函数返回的值时,我收到错误。有什么问题吗?

[错误]执行(60:20):ORA-06550:第11行,第20列:PLS-00382:表达式的类型错误ORA-06550:第11行,第3列:PL/SQL:忽略语句

封装规格

CREATE OR REPLACE package cust_wfm_budget
is
  TYPE cap_details_rec IS RECORD (
      cap_month VARCHAR2(55),
      overcap_per NUMBER,
      undercap_per NUMBER
  );

  function get_cap_month_fringes (
      p_sal_distribution_id IN NUMBER,
      p_cap_limit           IN NUMBER
  )
  return cap_details_rec;

end cust_wfm_budget;

封装体

CREATE OR REPLACE package body cust_wfm_budget
is

  l_cap_details cap_details_rec;

  FUNCTION get_cap_month_fringes (
      p_sal_distribution_id IN NUMBER,
      p_cap_limit           IN NUMBER
  )
  RETURN cap_details_rec
  IS
      lv_return           VARCHAR2(55):='TEST'; -- Keep as string
      l_overcap_per       NUMBER := 0; -- Assign numeric values directly
      l_undercap_per       NUMBER := 0;
  BEGIN
      -- Replace this logic with actual calculations for overcap_per and undercap_per
    --  l_overcap_per := /* Calculate overcap percentage */;
    --  l_undercap_per := /* Calculate undercap percentage */;

      RETURN cap_details_rec(lv_return, l_overcap_per, l_undercap_per);
  END get_cap_month_fringes;

end cust_wfm_budget;

/

犯罪;

匿名区块

DECLARE
  
     TYPE cap_details_rec IS RECORD (
                                cap_month VARCHAR2(55),
                                overcap_per NUMBER,
                                undercap_per NUMBER
                               );

  l_cap_details cap_details_rec;
BEGIN
  l_cap_details := cust_wfm_budget.get_cap_month_fringes(1, 1);
  -- Do something with l_cap_details
END;
plsql
  • 1 个回答
  • 14 Views
Martin Hope
ES.
Asked: 2023-12-21 21:57:26 +0800 CST

PL/SQL 代码中带有 IN 运算符的 IF 语句

  • 5

我想使用运算符比较值(VARCHAR2与列表中的值之一)IN。例如,值是 A,列表值是 B 和 C。值是

有效的简单静态代码:

IF 'A' NOT IN ('B', 'C') THEN
    DBMS_OUTPUT.PUT_LINE('Not');
ELSE
    DBMS_OUTPUT.PUT_LINE('In');
END IF;

非工作动态代码:

IF 'A' NOT IN ( SELECT COLUMN_VALUE FROM APEX_STRING.SPLIT('B:C', ':') ) THEN
    DBMS_OUTPUT.PUT_LINE('Not');
ELSE
    DBMS_OUTPUT.PUT_LINE('In');
END IF;

出现错误:

Error at line 39/48: ORA-06550: line 20, column 67:
PLS-00103: Encountered the symbol "(" when expecting one of the following:

   . ) , @ with <an identifier>
   <a double-quoted delimited-identifier> group having intersect
   minus partition start subpartition union where connect sample
The symbol "having" was substituted for "(" to continue.

无法理解哪里出错了。在 SQL 查询中,类似的带有IN运算符的代码可以工作。

plsql
  • 1 个回答
  • 34 Views
Martin Hope
PCM
Asked: 2023-09-26 21:15:15 +0800 CST

执行下一条sql语句

  • 5

在我的数据库中,表:

  • test1--不存在
  • 测试2--存在
  • 测试3--存在

运行下面的块时,它会为 test1 抛出“表不存在”错误。但是,尽管出现错误,我还是想为 test2 和 test3 运行以下 drop 语句,因为对于我的情况,“不存在”对我来说很好,因为我将在下一步中创建所有 3 个表。

set serveroutput ON;
BEGIN
    begin
    EXECUTE IMMEDIATE 'drop table test1';
    dbms_output.put_line('test1 dropeed successfully');
    EXECUTE IMMEDIATE 'drop table test2';
    dbms_output.put_line('test2 dropped successfully');
    EXECUTE IMMEDIATE 'drop table test3';
    dbms_output.put_line('test3 dropped successfully');
    exception
        when others then
            dbms_output.put_line('Error >> '|| SQLERRM ||' -->'|| dbms_utility.format_error_backtrace);
    end;
end;

期望:-它也应该删除 test2 和 test3,即使我们得到 test1 的表不存在错误。

plsql
  • 2 个回答
  • 22 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve