1. 程式人生 > >[oracle自定義函式]查詢表格的行數

[oracle自定義函式]查詢表格的行數

假如要查的表為emp(員工表),在scott使用者下預設有這張表。當前有14條記錄。

只需要執行

select count(*) from emp;
需求:現在要把表名變成動態傳入的,想查哪張表的行數只要傳入表名就行了

一、準備工作

在寫這個之前,我們先來寫一個根據員工id(empno)查詢員工姓名(ename)的自定義函式(getEmpName)

create or replace function getEmpName(empId in number)
return varchar2 is
  z varchar2(200);
begin
  select ename into z from emp where empno = empId;
  return z;
end;
呼叫該函式:
select getEmpName(7369) from dual;
符合預期(另外再測幾個員工id,都得到預期結果),說明編寫正確。

注:a.在oracle可以將查詢條件(where)中的引數值作為變數,能夠直接使用自定義函式中傳入的引數值

b.建立的函式“return varchar2 is”後面的varchar2需要給出確定的值,這裡是200

此處特別說明這兩點,是因為在動態傳表名的時候略有不同。

二、開始實現需求

1.建立自定義函式的寫法

仿照前面的思路,可以寫出如下函式

create or replace function getTableCount(tableName in varchar2)
return number is
  z number;
begin
  select count(*) into z from tableName;
  return z;
end;
但是編譯後會發現,

這樣寫出的函式是有問題的。我們換個思路,動態拼接sql語句,然後執行並返回結果

這裡需要再新增一個變數v_sql(varchar2型別)專門用來儲存sql語句,如果拼出的語句很長,可以把字元長度設大一些(最多32767,

create or replace function getTableCount(tableName in varchar2)
return number is
  z number;
  v_sql varchar2(2000);
begin
  v_sql:='select count(*) from '||tableName;
  execute immediate v_sql into z;
  return z;
end;
呼叫該函式:
select getTableCount('emp') from dual;

結果正確

再總結兩點:

a.在oracle不能將表名為變數,通過自定義函式中傳入的引數值得到表名直接執行sql語句;

而需要將得到的表名先拼成一條sql,然後執行完把值傳給變數,最後返回該變數

b.對比varchar2型別,我們看到在返回number時可以不用特意標註變數的位數

在“return number is”後面接的是“z number”。因為number這種型別不填位數時,自帶預設精度38

三、補充

如果只想測試下函式功能,並不想建立函式(執行一次就沒了)。可以這樣寫

declare
  tableNum number;
function getTableCount(tableName in varchar2)
return number is
  z number;
  v_sql varchar2(2000);
begin
  v_sql:='select count(*) from '||tableName;
  execute immediate v_sql into z;
  return z;
end;
begin
  tableNum:=getTableCount('emp');
  dbms_output.put_line(tableNum);
end;

直接在pl/sql的sql window中執行,可以看到同樣的結果