将默认参数设置为字符串Oracle PLSQL列表

时间:2014-03-28 04:49:20

标签: string oracle list parameters plsql

以下是我的工作内容:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept in VARCHAR2 DEFAULT
'Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT',
'Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting',
Mgr in VARCHAR2 DEFAULT NULL) AS

vManager Varchar2(30) := Mgr;
vDepartment Varchar2(30) := Dept;

我希望默认值是整个字符串列表。稍后在我的代码中,我希望选项能够指定一些管理器或几个部门,或者不输入任何内容,以便返回整个列表:

WHERE m.first_name ||' ' || m.last_name IN (vManager) -- NULL if I don't input anything
  OR d.department_name IN (vDepartment) -- All departments if I don't input anything

当我调用该函数,并且不输入任何内容时,我希望返回所有可能的行。这是期望的效果。

3 个答案:

答案 0 :(得分:1)

为了能够将字符串列表作为参数传递,您应该将参数更改为列表。

CREATE OR REPLACE TYPE t_departments IS TABLE OF VARCHAR2(30);

然后根据新类型创建您的程序:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept IN t_departments DEFAULT t_departments('Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT','Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting'), Mgr IN VARCHAR2 DEFAULT NULL) AS

稍后您可以使用MEMBER OF而不是IN来检查表中是否有某个值:

 ...
 WHERE d.department_name MEMBER OF Dept 
 ...

或者,如果您无法更改过程参数的类型,则可以使用变量:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept IN VARCHAR2 DEFAULT NULL, Mgr IN VARCHAR2 DEFAULT NULL) AS
  TYPE t_departments IS TABLE OF VARCHAR2(30);
  v_all_departments t_departments := t_departments('Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT','Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting');
  vManager VARCHAR2(30);
  vDepartment t_departments;
BEGIN
  IF Dept IS NULL THEN
    vDepartment := v_all_departments;
  ELSE
    vDepartment := t_departments(Dept);
  END IF;

  ...

  WHERE d.department_name MEMBER OF vDepartment

  ...

END;

答案 1 :(得分:0)

我觉得这里有些不清楚......

首先,这是一个程序 - 而不是一个功能,因此它不会返回任何东西。

varchar不是数组 当您获取或返回varchar2时 - 只有一个可能的字符串来回传递...如果您想使用列表 - 您应该检查PL / SQL提供的数组类型。 http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/05_colls.htm

第三 - 如果您有常量值,则在数据库中,它的位置在表中,而不是作为过程中的常量。

我建议你查看临时表 - 他们是一个很好的数据推动者,可以在“会话内”通信中找到你想要返回的列表。 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5824706700346810645
这些将是一个伟大的“会话中”/“连接”连接,就像你上面描述的那样(例如,选择...其中last_name in(从temptable选择管理器))。

另一件事 - 使用姓氏来识别数据库中的记录并不是你想要的方式。您可以使用唯一标识符和外键。 (如果您不熟悉术语 - What are database constraints?

如果我没有回答你的问题(或指出你的答案) - 请澄清你的问题,因为我不确定(可能和其他许多人一样)你究竟想做什么(逻辑上)。

答案 2 :(得分:0)

目前还不清楚你在问什么,但这里有一个最小的例子,你可以将一个可用作SQL查询一部分的值列表传递给PL / SQL子程序:

-- SQL type so that can be used in SQL context (the select-statement)
create or replace type strlist_t is table of varchar2(4000);
/

create or replace procedure foo(p_owners in strlist_t default strlist_t('JANI')) is
begin
  for i in (select * from all_tables 
             where owner in (select * from table(p_owners)))
  loop
    dbms_output.put_line(i.owner || '.' || i.table_name);
  end loop;
end;
/
show errors

begin
  -- define your own criteria
  foo(strlist_t('SYS', 'JANI'));
  -- use the default criteria
  foo;
end;
/

希望这有帮助!