PL/SQL 块以显示表详细信息

Posted

技术标签:

【中文标题】PL/SQL 块以显示表详细信息【英文标题】:PL/SQL Block to show the table details 【发布时间】:2020-09-19 17:23:19 【问题描述】:

我是 PL/SQL 新手,需要您的帮助..

我创建了名为(students) 的学生表并成功插入了 10 行。 我需要创建一个块,当用户输入学生 ID 时,应该显示与输入的学生 ID 匹配的所有详细信息。

SET SERVEROUTPUT ON;
ACCEPT inputID PROMPT 'Please enter the student ID to show the details'
DECLARE
B_students students%ROWTYPE;
BEGIN 
  SELECT *
  INTO B_students
  FROM students
  WHERE B_students.studentID= inputID;

dbms_output.put_line('Student details : ID:'
                     ||B_students.studentID
                     ||'Student Name'
                     ||B_students.studentName
                     ||'Student GPA'
                     ||B_students.studentGPA
                     ||'Student AGE'
                     ||B_students.studentAGE
                     ||'Student Gender'
                     ||B_students.studentGender);

END;

错误报告: “inputID”:无效的标识 PL/SQL:忽略 SQL 语句 06550.00000 -“第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误

【问题讨论】:

你在哪里运行这个?仅SQL*Plus 支持ACCEPT SQL 开发人员 .. 是这个问题吗? 是的,这就是问题所在。此语法特定于 SQLPlus。 如何在 SQL 开发人员中创建一个块来显示学生详细信息? @GMB - 不正确。 ACCEPT 命令,就像大多数(如果不是全部)sqlplus 命令一样,也在 SQL Developer 中完全实现。自己试试看。 OP的问题不是SQL Dev中的ACCEPT命令,而是他对输入变量的不正确引用。 【参考方案1】:

问题是标识符inputID 是在SQL*Plus 中声明的,而您的PL/SQL 块不能直接看到它。要使用它,您需要在它前面加上 & 字符:

SET SERVEROUTPUT ON;
ACCEPT inputID PROMPT 'Please enter the student ID to show the details'

DECLARE
  B_students students%ROWTYPE;
BEGIN 
  SELECT *
    INTO B_students
    FROM students
    WHERE B_students.studentID = &inputID;

  dbms_output.put_line('Student details : ID:'
                       ||B_students.studentID
                       ||'Student Name'
                       ||B_students.studentName
                       ||'Student GPA'
                       ||B_students.studentGPA
                       ||'Student AGE'
                       ||B_students.studentAGE
                       ||'Student Gender'
                       ||B_students.studentGender);

END;
/

注意在 SELECT 语句的 WHERE 子句中使用 &inputID 而不是 inputID

【讨论】:

【参考方案2】:

可能会创建一个包含SYS_REFCURSOR 的函数:

CREATE OR REPLACE FUNCTION get_std_rs( i_ID students.studentID%TYPE ) 
                    RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
BEGIN
  v_sql := 'SELECT *
              FROM students
             WHERE studentID = :inputID';

  OPEN v_recordset FOR v_sql USING i_ID;
  RETURN v_recordset;
END;
/

然后从 SQL Developer 的命令行调用:

VAR rc REFCURSOR
EXEC :rc := get_std_rs(123);
PRINT rc;
INTO子句不能用于多行返回,只能一行 仅限 通过上述方法,无需单独指定所有返回列

【讨论】:

以上是关于PL/SQL 块以显示表详细信息的主要内容,如果未能解决你的问题,请参考以下文章

接受用户的员工编号 从“员工”表中获取员工详细信息并将其存储到 PL SQL 记录类型变量并打印相同

关于如何使用存在和不存在的 PL/SQL 查询的问题

Oracle PL / SQL触发器,在UPDATE之前/之后仅用于识别表中已修改的列

需要编写一个 sql 脚本来查找 oracle 中任何数据库的元数据详细信息

PL/SQL详细介绍,设置oracle相关

如何查看dblink 的详细信息