Oracle 存储函数 - 将 table 名称作为参数传递

Oracle stored function - pass table name as parameter

我正在尝试在 Oracle 中创建一个存储函数来计算 table 行..我想使 table 名称动态化,所以我将它作为参数传递,存储的函数代码如下所示

create type tes_jml_obj is object(jumlah integer);
create type tes_jml_table is table of tes_jml_obj;
create or replace function jumlahBaris(namatabel varchar)
return tes_jml_table
is
  tabel tes_jml_table := tes_jml_table();
begin
  for r in (execute immediate 'select count(*) as jumlah from' || namatabel)
  loop
    tabel.extend;
    tabel(1) := tes_jml_obj(r.jumlah);
  end loop;
  return tabel;
end;

但是当我执行它时,它 returns 出错了。我在这里错过了什么吗?这是动态获取 table 行的正确方法吗?

  1. 你的立即执行将return只有一个值,计数,那么有什么要循环的?
  2. 我也不确定 execute immediate 是否可以使用隐式游标。
  3. 在您的 SQL 中,您似乎在 from 关键字后没有 space。

试试这样的方法:

create or replace function jumlahBaris(namatabel varchar)
return tes_jml_table
is
  tabel tes_jml_table := tes_jml_table();
  the_count integer;
  the_sql varchar(100);
begin
  the_sql := 'select count(*) as jumlah from ' || namatabel;
  execute immediate the_sql INTO the_count;

  if the_count IS NOT NULL THEN
      tabel.extend;
      tabel(1) := tes_jml_obj(the_count);
  end if;
  return tabel;
end;
  1. EXECUTE IMMEDIATE 语句中 FROM 关键字 后缺少 space
  2. EXECUTE IMMEDIATE 语句有一个语法错误。您缺少 INTO 子句。
  3. 您不能在 CURSOR FOR LOOP 中使用 EXECUTE IMMEDIATE。基本上,如上文第 2 点所述,您 没有从立即执行语句中返回任何内容
  4. LOOP迭代语法 不正确。语法是 FOR r IN 1..COUNT().

修正你的代码后,它看起来像这样:

SQL> CREATE OR REPLACE TYPE TES_JML_OBJ IS OBJECT(JUMLAH NUMBER)
  2  /

Type created.

SQL> CREATE OR REPLACE TYPE TES_JML_TABLE IS TABLE OF TES_JML_OBJ
  2  /

Type created.

SQL> CREATE OR REPLACE
  2    FUNCTION jumlahBaris(
  3        namatabel VARCHAR2)
  4      RETURN tes_jml_table
  5    IS
  6      TABEL TES_JML_TABLE := TES_JML_TABLE();
  7      cnt NUMBER;
  8    BEGIN
  9      EXECUTE IMMEDIATE 'select count(*) as jumlah from ' || NAMATABEL INTO CNT;
 10      FOR R IN 1..CNT
 11      LOOP
 12        TABEL.EXTEND;
 13        TABEL(R) := TES_JML_OBJ(R);
 14        dbms_output.put_line(TES_JML_OBJ(R).jumlah);
 15      END LOOP;
 16      RETURN tabel;
 17    END;
 18    /

Function created.

SQL> SHO ERR
No errors.

因此,函数编译没有错误。让我们执行它并查看输出:

SQL> SET SERVEROUTPUT ON
SQL> SELECT JUMLAHBARIS('EMP') FROM DUAL;

JUMLAHBARIS('EMP')(JUMLAH)
--------------------------------------------------------------------------------
TES_JML_TABLE(TES_JML_OBJ(1), TES_JML_OBJ(2), TES_JML_OBJ(3), TES_JML_OBJ(4), TE
S_JML_OBJ(5), TES_JML_OBJ(6), TES_JML_OBJ(7), TES_JML_OBJ(8), TES_JML_OBJ(9), TE
S_JML_OBJ(10), TES_JML_OBJ(11), TES_JML_OBJ(12), TES_JML_OBJ(13), TES_JML_OBJ(14
))


1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>