oracle存储过程中循环调用存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程中循环调用存储过程相关的知识,希望对你有一定的参考价值。

参考技术A 1、没有必要每次都提交,到了CKPT,系统自动处理的
2、出现异常你可以回滚
3、提交了的不会回滚
4、调用的时候不提交,循环后统一提交
后面的问题:
关键的地方把SQL语句打印出来,根据这些SQL语句查询出数据做分析

调用存储过程的Oracle游标循环

【中文标题】调用存储过程的Oracle游标循环【英文标题】:Oracle cursor loop that calls stored procedure 【发布时间】:2019-08-12 10:17:10 【问题描述】:

如何创建一个调用存储过程的循环? 我有一个包含产品列表的表,我想使用存储过程对照表检查它。

示例表格内容:

苹果 橙色 香蕉

在本例中,我想使用参数执行此过程 3 次:(苹果、橙子、香蕉)。

我无法使用光标来工作...

DECLARE
  CURSOR cur_product
  IS
    SELECT product_name FROM test.products;
BEGIN
  FOR product IN cur_product
  LOOP
    BEGIN
        EXECUTE TEST_PRODUCT( product);
    END;
  END LOOP;
END;

存储过程:

CREATE OR REPLACE PROCEDURE TEST_PRODUCT 
(
  PRODUCT IN VARCHAR2 
) AS 
BEGIN
  INSERT INTO TABLE test.product_counts
  SELECT COUNT(*) FROM test.products WHERE product_name = &PRODUCT

END TEST_PRODUCT;

【问题讨论】:

execute 在 PL/SQL 中不需要调用存储过程。并且在 PL/SQL 中也不使用& 引用参数。 但您不需要循环或存储过程来执行此操作。而test.product_counts如果不将产品名称和计数一起存储有什么用? 【参考方案1】:

您不需要在 for 循环中放置另一个 begin end 块。也执行立即不需要你做这项工作。传递参数时不需要使用'&'。

DECLARE
  CURSOR cur_product`enter code here`
  IS
    SELECT product_name FROM test.products;
BEGIN
  FOR product IN cur_product
  LOOP
        TEST_PRODUCT( product);
  END LOOP;
END;

存储过程(不要忘记 COMMIT 语句):

CREATE OR REPLACE PROCEDURE TEST_PRODUCT 
(
  PRODUCT IN VARCHAR2 
) AS 
BEGIN
  INSERT INTO test.product_counts
  SELECT COUNT(*) FROM test.products WHERE product_name = PRODUCT;

COMMIT;

END TEST_PRODUCT;

【讨论】:

【参考方案2】:

试试这个:

DECLARE
  CURSOR cur_product
  IS
    SELECT product_name FROM test.products;
BEGIN
  FOR product IN cur_product
  LOOP
    BEGIN
        -- removed execute and added .product_name
        TEST_PRODUCT( product.product_name); 
    END;
  END LOOP;
END;

存储过程:

CREATE OR REPLACE PROCEDURE TEST_PRODUCT 
(
  PRODUCT IN VARCHAR2 
) AS 
BEGIN
  INSERT INTO TABLE test.product_counts
  SELECT COUNT(*) FROM test.products WHERE product_name = PRODUCT -- removed ampersand

END TEST_PRODUCT;

干杯!!

【讨论】:

【参考方案3】:

最简单的版本是:

begin
    for r in (
        select dummy from dual
    )
    loop
        dbms_output.put_line(r.dummy);
    end loop;
end;

请注意,除非您确实需要 cursor attribute,否则您不必显式声明游标。

此外,现代编程通常不会以大写形式进行。

【讨论】:

【参考方案4】:

您可以在测试模式中创建它:

CREATE OR REPLACE PROCEDURE TEST_PRODUCT 
(
  PRODUCT IN VARCHAR2 
) AS 
BEGIN
  INSERT INTO  product_counts(productCounts)  SELECT COUNT(*) FROM products 
WHERE product_name = PRODUCT;

END TEST_PRODUCT;

DECLARE
  CURSOR cur_product
  IS
   SELECT distinct PRODUCT_NAME FROM products;
BEGIN
  FOR product IN cur_product
LOOP
BEGIN
     TEST_PRODUCT( product.product_name);
END;
END LOOP;
END;

我在游标中添加了不同的product_name,这是因为product_counts 表中不会有重复的产品。如果您想在该表中使用重复的产品名称,您可以省略 distinct。

【讨论】:

以上是关于oracle存储过程中循环调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

调用存储过程的Oracle游标循环

Oracle存储过程游标for循环怎么写

Oracle存储过程游标for循环怎么写

Instr函数在oracle存储过程里怎么用

Oracle存储过程游标for循环怎么写