pl/sql 循环遍历表并将行的每个条目传递给存储过程

Posted

技术标签:

【中文标题】pl/sql 循环遍历表并将行的每个条目传递给存储过程【英文标题】:pl/sql loop through the table and pass the each entry of the row to a stored procedure 【发布时间】:2021-08-11 10:10:09 【问题描述】:

我有一个包含三列(table_name、column_name、data_type)的表,我试图将这三列的值作为参数传递给循环中的存储过程。

现在,我开发了一个非常基本的代码来检查循环是否正常。

DECLARE
 
  cursor c1 is 
    select table_name, column_name, data_type from table_list;

BEGIN
  FOR i IN c1 LOOP
    DBMS_OUTPUT.PUT_LINE(i.table_name||' ' ||i.column_name ||''||i.data_type);
   
    
  END LOOP;
END;

关于问题的更新:循环工作正常,但是当我调用如下代码所示的过程时,它给了我一个错误

DECLARE
 
  cursor c1 is select table_name, column_name,data_type from table_list;

BEGIN
  FOR i IN c1 LOOP

    DBMS_OUTPUT.PUT_LINE(i.table_name||' ' ||i.column_name ||' '||i.data_type);
    UPD_PII_DATA(i.table_name,i.column_name,i.data_type);
    DBMS_OUTPUT.PUT_LINE(i.table_name|| ' '|| ' and column '|| i.column_name|| ' completed test');

  END LOOP;
END;

第 1 行出错 ORA-00942: 表或视图不存在 ORA-06512: 在“MP_ODI.UPD_PII_DATA”,第 13 行 ORA-06512: 在第 9 行 ORA-06512: 在第 9 行

请帮我解决这个错误

【问题讨论】:

【参考方案1】:

按照您的说法,您只需调用该过程并传递由游标检索到的值。打字少一点:

BEGIN
   FOR i IN (SELECT table_name, column_name, data_type FROM table_list)
   LOOP
      DBMS_OUTPUT.PUT_LINE (i.table_name || ' ' || i.column_name || '' || i.data_type);

      -- call the procedure, pass values
      my_procedure (i.table_name, i.column_name, i.data_type);
   END LOOP;
END;

【讨论】:

嗨@littlefoot,我已经调用了proc,但我收到一个错误:第1行错误ORA-00942:表或视图不存在ORA-06512:在“MP_ODI.UPD_PII_DATA”,第 13 行 ORA-06512:第 9 行 ORA-06512:第 9 行 如您所说,您正在引用一个不存在的表,或者 - 如果存在 - 您没有使用它的权限。如果是后者,它是否 - 无论如何 - 属于另一个用户?如果是这样,您是否通过 role 授予了它的权限?如果是这样,它将无法在命名存储过程中工作,因此您必须直接(即不通过角色)授予权限。

以上是关于pl/sql 循环遍历表并将行的每个条目传递给存储过程的主要内容,如果未能解决你的问题,请参考以下文章

每个将表名传递给过程的 ORACLE PL/SQL

在 PL/SQL 存储过程中将表作为参数传递

如何遍历表的列名并将值传递给 MSSQL while 循环中的 UDF

如何在 PL/SQL 中按表集合使用索引

是遍历jTable并将列值传递给java中的sql查询

我想在 PL SQL 中接受用户输入并将其传递给程序,给我看一个简单的程序吗?