P********R 发帖数: 1691 | 1 请问下面的code有问题么? UPDATE段能不能改得更短些?
谢谢!
DECLARE
v_Partid INVENTORY.partid%TYPE := &1;
v_Qty ORDERITEMS.qty%TYPE := &2;
v_Counter NUMBER := 0;
EnteredQuantityIsZero EXCEPTION;
StockQuantityIsNotEnough EXCEPTION;
BEGIN
--Verify that the quantity is more than zero.
IF v_Qty = 0 THEN
RAISE EnteredQuantityLessThenOne;
END IF;
--update INVENTORY.
UPDATE INVENTORY
SET stockqty = (SELECT INVENTORY.stockqty - v_qty
FROM INVENTORY
WHERE INVENTORY.partid = v_Partid)
WHERE partid = v_Partid;
--Check the new stockqty.
SELECT stockqty
INTO v_Counter
FROM INVENTORY
WHERE INVENTORY.partid = v_Partid;
IF v_Counter <= 0 THEN
ROLLBACK;
RAISE StockQuantityIsNotEnough;
END IF;
/*other code*/
DBMS_OUTPUT.PUT_LINE ('Inserted successfully.');
COMMIT;
EXCEPTION
WHEN sth THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
|
B*****g 发帖数: 34098 | 2 你的update里为啥要有select
【在 P********R 的大作中提到】 : 请问下面的code有问题么? UPDATE段能不能改得更短些? : 谢谢! : DECLARE : v_Partid INVENTORY.partid%TYPE := &1; : v_Qty ORDERITEMS.qty%TYPE := &2; : : v_Counter NUMBER := 0; : : EnteredQuantityIsZero EXCEPTION; : StockQuantityIsNotEnough EXCEPTION;
|
c*****d 发帖数: 6045 | 3 UPDATE INVENTORY
SET stockqty = (SELECT INVENTORY.stockqty - v_qty
FROM INVENTORY
WHERE INVENTORY.partid = v_Partid)
WHERE partid = v_Partid;
不就等价于
UPDATE INVENTORY
SET stockqty = stockqty - v_qty
WHERE partid = v_Partid;
【在 B*****g 的大作中提到】 : 你的update里为啥要有select
|
B*****g 发帖数: 34098 | 4 授人以渔是上策,授人以鱼是下策
【在 c*****d 的大作中提到】 : UPDATE INVENTORY : SET stockqty = (SELECT INVENTORY.stockqty - v_qty : FROM INVENTORY : WHERE INVENTORY.partid = v_Partid) : WHERE partid = v_Partid; : 不就等价于 : UPDATE INVENTORY : SET stockqty = stockqty - v_qty : WHERE partid = v_Partid;
|
c*****d 发帖数: 6045 | 5 说的好
其实我就是灌水
【在 B*****g 的大作中提到】 : 授人以渔是上策,授人以鱼是下策
|
P********R 发帖数: 1691 | 6 没学好,所以无法确定能不能不要。
【在 B*****g 的大作中提到】 : 你的update里为啥要有select
|
P********R 发帖数: 1691 | 7 谢谢!
【在 c*****d 的大作中提到】 : 说的好 : 其实我就是灌水
|
P********R 发帖数: 1691 | 8 说的很对。
但对于刚开始学的人来说,举例说明会起到事半功倍的效果。
网上是可以查到很多例子,但专家们的例子都很简单,很正确。通过把一个错误的(或
复杂的)改对了(简单了)可以学到很多的,这也是在网上是学不到的。比如说,分步
测试的方法,对你们也许是再平常不过的,但对我却是不知道的,尽管我让为应该会有
这类方法,但coolbid如果不说,我恐怕还得多读很多书才会知道如何用这个方法。而
且有些经验是从实践中得出来的,有些小技巧书上也不见得会写。书和你们的经验都是
我求学的地方。谢谢专家们!
【在 B*****g 的大作中提到】 : 授人以渔是上策,授人以鱼是下策
|
B*****g 发帖数: 34098 | 9 我个人认为学习解决问题的方法远比学习一个知识点重要得多。
以你写的code为例,大家来探讨一下:
UPDATE INVENTORY
SET stockqty = (SELECT INVENTORY.stockqty - v_qty
FROM INVENTORY
WHERE INVENTORY.partid = v_Partid)
WHERE partid = v_Partid;
这个你自己看着都觉得别扭,怎么办?当然,去问会的同学也是一种方法,但肯定不是
最好的。
学习第一大法,***读文档***
找到oracle 11gR2的关于update的文档(怎么找到文档的?晕倒)。
http://docs.oracle.com/cd/E11882_01/server.112/e17118/statement
一共没几行,里面已经给出例子能解决你的问题。
如果你仔细阅读这篇文档,你会发现你的code还可以继续优化。基本上就解决了另外一
个问题,为什么update后还要再用一个select才能拿到更新结果,不能一次到位吗?通
过对文档的学习,不仅解决了了当前问题,还可以学到其他相关知识。
当然,这个问题解决了,还有其他问题。比如,为什么update后再检查存货是否充足(
不充足则回滚),如果存货不充足,我们就不让update是否会更好些?
我认为提出问题并找到问题的解决方法是渔,而解决问题办法本身是鱼。给鱼拿鱼的过
程是很很轻松的,教渔学渔的过程是很痛苦的。值得吗?
其实常用的方法就2种,查文档和google,下次我们再介绍google的技巧。
最后一个建议,SQL是PLSQL的基础,应该先熟练掌握一定的SQL基础再深入学习PLSQL。
没有很好SQL能力的PLSQL developer就会像coolbid的同事,写几层嵌套的cursor而别
人用一个简单的join就解决了。
bless and add oil
【在 P********R 的大作中提到】 : 说的很对。 : 但对于刚开始学的人来说,举例说明会起到事半功倍的效果。 : 网上是可以查到很多例子,但专家们的例子都很简单,很正确。通过把一个错误的(或 : 复杂的)改对了(简单了)可以学到很多的,这也是在网上是学不到的。比如说,分步 : 测试的方法,对你们也许是再平常不过的,但对我却是不知道的,尽管我让为应该会有 : 这类方法,但coolbid如果不说,我恐怕还得多读很多书才会知道如何用这个方法。而 : 且有些经验是从实践中得出来的,有些小技巧书上也不见得会写。书和你们的经验都是 : 我求学的地方。谢谢专家们!
|
d****n 发帖数: 12461 | 10 没人吐槽其实最重要的是atomic么?不过貌似lz先写后检验再commit没什么问题。 |
|
|
c*****d 发帖数: 6045 | 11 bj妹妹还要搞连载,等你下篇贴子《google的学问》
【在 B*****g 的大作中提到】 : 我个人认为学习解决问题的方法远比学习一个知识点重要得多。 : 以你写的code为例,大家来探讨一下: : UPDATE INVENTORY : SET stockqty = (SELECT INVENTORY.stockqty - v_qty : FROM INVENTORY : WHERE INVENTORY.partid = v_Partid) : WHERE partid = v_Partid; : 这个你自己看着都觉得别扭,怎么办?当然,去问会的同学也是一种方法,但肯定不是 : 最好的。 : 学习第一大法,***读文档***
|
B*****g 发帖数: 34098 | 12 这还用学,嘿嘿
【在 c*****d 的大作中提到】 : bj妹妹还要搞连载,等你下篇贴子《google的学问》
|
P********R 发帖数: 1691 | 13 领教了!确实是很对。
至于“比如,为什么update后再检查存货是否充足(不充足则回滚),如果存货不充足
,我们就不让update是否会更好些?”我也想应该是先检查够不够,然后再UPDATE。但
题目要求的就是要先UPDATE,然后再检查。只能是按题目做答了。
【在 B*****g 的大作中提到】 : 我个人认为学习解决问题的方法远比学习一个知识点重要得多。 : 以你写的code为例,大家来探讨一下: : UPDATE INVENTORY : SET stockqty = (SELECT INVENTORY.stockqty - v_qty : FROM INVENTORY : WHERE INVENTORY.partid = v_Partid) : WHERE partid = v_Partid; : 这个你自己看着都觉得别扭,怎么办?当然,去问会的同学也是一种方法,但肯定不是 : 最好的。 : 学习第一大法,***读文档***
|
c*****d 发帖数: 6045 | 14 这里面的学问大了
为啥你每次都能google到你想要的答案
有的人却不知道搜哪些关键字
最简单的用法是google advanced search
比如oracle spfile
1.在特定网站搜
oracle spfile site:mitbbs.com
oracle spfile site:edu
2.排除特定内容
oracle spfile -pfile
3.指定特定内容
oracle spfile +pfile
4.特定文件类型
oracle spfile filetype:pdf
5.关键字
oracle spfile "ask tom"
进阶用法由beijing mm讲解
【在 B*****g 的大作中提到】 : 这还用学,嘿嘿
|
B*****g 发帖数: 34098 | 15 没用过,汗。。。
我就是随便古,一般没用看超过前五个,超过第二页的基本没答案
【在 c*****d 的大作中提到】 : 这里面的学问大了 : 为啥你每次都能google到你想要的答案 : 有的人却不知道搜哪些关键字 : 最简单的用法是google advanced search : 比如oracle spfile : 1.在特定网站搜 : oracle spfile site:mitbbs.com : oracle spfile site:edu : 2.排除特定内容 : oracle spfile -pfile
|