Plsql 表没有作为主键的ineteger如何对其执行操作?
这个问题是在我大学的一次实践考试中提出的。 问:表格有以下列头/列:Plsql 表没有作为主键的ineteger如何对其执行操作?,plsql,Plsql,这个问题是在我大学的一次实践考试中提出的。 问:表格有以下列头/列: medicine_name,medicine_manufacture_date,medicine_expiry_date. 正如列标题名称所描述的那样,其中包含了有关药物的相应数据。 现在,他们要求编写一个pl/sql块来列出所有过期药物的名称,即当前系统日期大于药物的过期日期值。 我强烈认为必须在表中添加连续整数(如1,2,3,…n)列,该列将作为每个药品名称的主键。药品名称是唯一的,但要执行迭代操作,它们应该拥有一个整数
medicine_name,medicine_manufacture_date,medicine_expiry_date.
正如列标题名称所描述的那样,其中包含了有关药物的相应数据。
现在,他们要求编写一个pl/sql块来列出所有过期药物的名称,即当前系统日期大于药物的过期日期值。
我强烈认为必须在表中添加连续整数(如1,2,3,…n)列,该列将作为每个药品名称的主键。药品名称是唯一的,但要执行迭代操作,它们应该拥有一个整数主键。
是否仍然可以在不分配ineteger主键的情况下获得结果
我改变了表格,给每条记录分配了主键,并写了下面的代码块。。。它起作用了
但是我想在不分配主键的情况下完成它。所有可能的聪明方式都会被崇拜!请建议更正我代码中的任何类型。。。我的代码如下:
declare
a date;
b date;
diff number(10);
medicine varchar(25);
begin
a:=sysdate;
for i in 1..5
loop
select medicine_expiry_date into b from med_details where med_id=i ;
diff:=trunc(a-b);
if
diff>0 then
select medicine_name into medicine from med_details where med_id=i;
dbms_output.put_line(medicine);
end if;
end loop;
end;
/
看起来很简单。。。我怀疑有一些额外的细节
/*
Q: A table has following columnheads/columns:
medicine_name,
medicine_manufacture_date,
medicine_expiry_date.
Now they asked to write a pl/sql block to make list of all medicines' names which have expired
(i.e.current system date is greater than the expirydate values of the medicine).
*/
-- SQL:
SELECT medicine_name
FROM a_table
WHERE medicine_expiry_date < SYSDATE;
-- PL/SQL v.1:
DECLARE
TYPE medicine_ntt IS TABLE OF a_table%ROWTYPE;
l_medicine medicine_ntt;
BEGIN
SELECT medicine_name
, medicine_expiry_date
BULK COLLECT INTO l_medicine
FROM a_table;
FOR indx IN 1..l_medicine.COUNT LOOP
IF l_medicine(indx).medicine_expiry_date < SYSDATE THEN
DBMS_OUTPUT.PUT_LINE(l_medicine(indx).medicine_name);
END IF;
END LOOP;
END;
-- PL/SQL v.2:
DECLARE
CURSOR medicine_cur IS
SELECT medicine_name
, medicine_expiry_date
FROM a_table;
TYPE medicine_ntt IS TABLE OF medicine_cur%ROWTYPE;
l_medicine medicine_ntt;
l_medicine_expired medicine_ntt := medicine_ntt();
BEGIN
OPEN medicine_cur;
FETCH medicine_cur BULK COLLECT INTO l_medicine;
CLOSE medicine_cur;
FOR indx IN 1..l_medicine.COUNT LOOP
IF l_medicine(indx).medicine_expiry_date < SYSDATE THEN
l_medicine_expired.EXTEND;
l_medicine_expired(l_medicine_expired.LAST) := l_medicine(indx);
END IF;
END LOOP;
FOR indx IN 1..l_medicine_expired.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(l_medicine_expired(indx).medicine_name);
END LOOP;
END;
试一试
如果需要其他表引用此表,并且没有其他实用的候选键可用,则可以在此表上放置一个人工主键,但不需要回答上述问题
共享和享受。不需要整数主键。你认为为什么需要它?太好了,它工作得太好了!我不知所措!你从哪里学的书请给它起个名字…谢谢!我通过多年的编程学习了PL/SQL。就书籍而言,我喜欢和喜欢。分享和享受。再次感谢亲爱的鲍勃,我希望我能有一个像你这样的大师!我刚刚编辑了我的问题并添加了我的代码,如果你建议我改进的话,我会很高兴的。。我一周前就开始学习pl/sql了。谢谢你的回复!你能用更压缩的方式来做吗@Deepeshkumar看一下PL/SQLV.1
BEGIN
DBMS_OUTPUT.PUT_LINE('The following medicines have expired:');
FOR aRow IN (SELECT MEDICINE_NAME
FROM MEDICINE
WHERE EXPIRY_DATE < SYSDATE)
LOOP
DBMS_OUTPUT.PUT_LINE(aRow.MEDICINE_NAME);
END LOOP;
END;