【问题标题】:Using ACCEPT, CASE to create CURSOR in pl/sql在 pl/sql 中使用 ACCEPT、CASE 创建 CURSOR
【发布时间】:2015-01-24 07:48:54
【问题描述】:

我正在尝试创建一个脚本,允许用户在收集学生联系信息时从 ACCEPT 中选择要使用的 CASE 群体。

PROMPT 'Select a popluation for emails'
PROMPT '1. Currently registered'
PROMPT '2. New Applicants'
PROMPT
ACCEPT cnt number PROMPT 'Selection: ';
...
CURSOR stu_lst IS  
CASE &cnt
    WHEN 1 THEN  -- Current registered students.
        select distinct SFRSTCA_PIDM pidm
        from   SFRSTCA
        where  SFRSTCA_TERM_CODE = '201403' and
               SFRSTCA_LEVL_CODE = '01' and
               SFRSTCA_RSTS_CODE = 'RE';
    WHEN 2 THEN  -- New applicants
        select app_pidm pidm
        from   app
        where  app_term = 'Fall 2014';
    ELSE
        -- Incorrect selection.
        DBMS_OUTPUT.PUT_LINE('Incorrect selection made.');
        exit;
    END;
END;

【问题讨论】:

  • 您的摘录没有使用光标 - 您将如何处理它?您真的想要 PL/SQL 和游标,还是尝试查询适当的表并显示结果,那么普通 SQL 就可以了?
  • 您是否曾经编写过一个 SQL 脚本,只是为了让某人想要相同的数据,只是不同的人群。然后一两个月后,原始请求又回来了。然后其他人想要相同的日期,但他们想要第三人口。一直以来,您只需对脚本进行一些小调整,因为这样做更容易。
  • 我不确定这与我所问的有什么关系...我正在检查您是否需要 PL/SQL,因为您正在处理来自游标的数据;或者如果你只是显示它。
  • 我希望能够运行脚本,选择1,2,3...???根据输入的选择,它将运行特定的 SELECT 脚本来创建人口组(CURSOR 列表)

标签: sql oracle plsql


【解决方案1】:

假设两个查询返回相同的数据类型,您可以使用带有过滤器的联合来检查每个部分中的变量;类似:

DECLARE
  CURSOR stu_lst IS
    -- Current registered students.
    select distinct SFRSTCA_PIDM pidm
    from   SFRSTCA
    where  &cnt = 1 and
           SFRSTCA_TERM_CODE = '201403' and
           SFRSTCA_LEVL_CODE = '01' and
           SFRSTCA_RSTS_CODE = 'RE';
    UNION ALL
    -- New applicants
    select app_pidm
    from   app
    where  &cnt = 2 and
           app_term = 'Fall 2014';

  invalid_argument EXCEPTION;
  ...
BEGIN
  IF &cnt NOT IN (1, 2) THEN
    RAISE invalid_argument;
  END IF

  FOR rec IN stu_lst LOOP
    h_pidm := rec.pidm;
    ...
  END LOOP;

EXCEPTION
  WHEN invalid_argument THEN
    dbms_output.put_line('Incorrect selection made.');
END;
/

您还可以声明一个游标变量,并在块主体内的 case 语句中使用适当的查询打开它。不过,这与您的显式游标语法一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多