【问题标题】:please find the solution of this problem. ( in PL SQL ) --------请找到这个问题的解决方案。 (在 PL SQL 中)--------
【发布时间】:2020-12-12 17:04:19
【问题描述】:

我正在做一个作业,最后一个问题表明我调用问题 2 中的过程和问题 3 中的函数,然后将它们放入插入子句中(问题 4)。

  1. 为匿名块编写 PL/SQL 代码以执行以下操作(在包中):

a) 获取给定医生 ID 的医生姓名(从键盘读取) 使用函数 [FunGetDoctorName]。

b) 获取给定部门 id 的部门名称(从 键盘)使用过程 [ProGetepartmentName]。

c) 插入医生姓名和科室名称(您从 功能和

procedure),将序列号和当前日期包含在 访问表。

将答案放入(包)

这是我的表格代码:

CREATE TABLE DEPT(
DeptNo      NUMBER PRIMARY KEY,
DeptName    VARCHAR2(30) NOT NULL);

CREATE TABLE DOCTORS(
DoctorID    NUMBER PRIMARY KEY,
DoctorNAME  VARCHAR2(30) NOT NULL,
DeptNo      NUMBER REFERENCES DEPT(DEPTNO),
Salary      NUMBER NOT NULL);

CREATE TABLE VISITINGS(
SlNo        NUMBER PRIMARY KEY,
DoctorName  VARCHAR2(30),
DepartmentName  VARCHAR2(30),
VisitDate   DATE);

INSERT INTO DEPT VALUES(10,'ENT');
INSERT INTO DEPT VALUES(20,'Orthopedic');
INSERT INTO DEPT VALUES(30,'Cardiology');
INSERT INTO DEPT VALUES(40,'Neurology');

INSERT INTO DOCTORS VALUES(101,'Abheer',20,2550);
INSERT INTO DOCTORS VALUES(102,'Zuwaina',10,2175);
INSERT INTO DOCTORS VALUES(103,'Sara',30,1985);
INSERT INTO DOCTORS VALUES(104,'Fatma',20,2200);
INSERT INTO DOCTORS VALUES(105,'Laila',10,2600);

INSERT INTO VISITINGS VALUES(1,'Sara','Cardiology','10-Nov-19');
INSERT INTO VISITINGS VALUES(2,'Abheer','Orthopedic','11-Nov-19');

我的功能

create or replace function FunGetDoctorName(Docid number) return varchar2 is
docname DOCTORS.DoctorName%type;
Begin
select DoctorName into docname from DOCTORS where DoctorID = Docid;
return docname;
End ;
/

我的程序

create or replace procedure ProGetDepartmentName is
depname dept.DeptName%type;
Begin
select DeptName into depname from dept where DeptNo =10;
dbms_output.put_line(depname);
End ;
/ 

问题来了:

Create or replace package pkg1 is 
Function FunGetDoctorName(Docid Number) return varchar2 ;
procedure ProGetDepartmentName(DeptNo NUMBER);
end pkg1;
/
CREATE OR REPLACE PACKAGE BODY pkg1 AS

FUNCTION FunGetDoctorName(Docid Number)
RETURN varchar2 IS
   docname DOCTORS.DoctorName%type;
BEGIN
   select DoctorName into docname from DOCTORS where DoctorID = Docid;
return docname ;
END;
PROCEDURE ProGetDepartmentName(DeptNo NUMBER) IS
depname dept.DeptName%type;
BEGIN
 Select DeptName into depname from dept where DeptNo=10; 
dbms_output.put_line(depname) ;
END;
END pkg1 ;
/
declare
ProGetDepartmentName
(:DeptNo in dept.DeptNO%type,
 depname in dept.DeptName%type) 
FunGetDoctorName
(:Docid in DOCTORS.DoctorID%type ,
docname in DOCTORS.DoctorName%type);
docname varchar2(30);
depname varchar2(30);
Docid number;
serial number;
is 
Begin
dbms_output.put_line('Department Name: '||depname);
select count(slno) into serial from visitings;
serial :=serial+1;
insert into visitings(slno,doctorname,departmentname,visitdate) values(serial,docname,depname,sysdate);
End;
/

我不断收到错误:

SP2-0552:绑定变量“DOCID”未声明。

【问题讨论】:

  • 使用函数为变量赋值,类似于doctorName := myfunction(DocId)。要使用过程进行分配,它需要一个out 参数,那么它将是myprocedure(inDeptId, OutDeptName);
  • 另外,你的桌子设计有缺陷。在您的表 VISITINGS 中,您应该使用 DoctorID 和 DepNo 而不是 DoctorName 和 DepartmentName,外键返回 DOCTORS 和 DEPT。

标签: sql oracle plsql oracle10g


【解决方案1】:

首先,您的过程必须有一个in 和一个out 参数,以便您可以传递deptno 并获得deptname 作为输出。

procedure ProGetDepartmentName(p_depnum number,P_depname out varchar)
is
Begin
  select DeptName into P_depname from dept where DeptNo = p_depnum;
  dbms_output.put_line(p_depnum);
End ;
/ 

在您的 pl/sql 块中,您可以使用替换变量从键盘获取输入,如下所示:

declare
  V_DeptNo dept.DeptNO%type := &dept_no
  V_deptname in dept.DeptName%type;
  V_Docid in DOCTORS.DoctorID%type := &doc_id;
is 
Begin
  Pkg1.ProGetDepartmentName(v_deptno,  v_deptname);
  dbms_output.put_line('Department Name: '|| v_deptname);
  insert into visitings(slno,doctorname,departmentname,visitdate) 
    values((select count(slno) + 1 from visitings),FunGetDoctorName(v_docid),v_deptname,sysdate);
End;
/

注意

  1. 您应该使用sequence,而不是从表中获取计数并将其添加到slno
  2. procedurefunction 中,使用exception block 优雅地处理未找到行或找到多条记录或任何其他问题。
  3. 在插入表格时,您还应该使用exceprion block 优雅地处理问题。 (在您的情况下,由于 count(slno) + 1 逻辑需要它,因为它可以为同时执行的不同会话分配相同的编号,这会导致主键违规)

【讨论】:

  • 对不起,它仍然无法正常工作......我需要将此部分添加到包装中。非常感谢。
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2020-12-15
  • 1970-01-01
  • 2020-01-12
  • 2023-04-10
相关资源
最近更新 更多