由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 请教PL/SQL 语法
相关主题
mysql challengeRe: 精通SQL,VB,JAVA,C++(optional)的developer多么? (转载)
请教:PL/SQLplsql 求救--速度太慢了, 咋办呢
求教:求救,这个更新如何写?
新手求教,plsql collection 参数传入问题,非常感谢。advices please on learning Oracle
服了我们公司的老印DEVDW developer 位置的代码在线测试考什么语言?谢谢!
我说个有意思的题目大家玩玩吧15万收入怎么样
[转载] a PLSQL question大家考OCP都去哪里上课?
Oracle SQL Tunning Problem!PL SQL 问题
相关话题的讨论汇总
话题: partid话题: inventory话题: where话题: update话题: stockqty
进入Database版参与讨论
1 (共1页)
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没什么问题。
相关主题
我说个有意思的题目大家玩玩吧Re: 精通SQL,VB,JAVA,C++(optional)的developer多么? (转载)
[转载] a PLSQL questionplsql 求救--速度太慢了, 咋办呢
Oracle SQL Tunning Problem!求救,这个更新如何写?
进入Database版参与讨论
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

1 (共1页)
进入Database版参与讨论
相关主题
PL SQL 问题服了我们公司的老印DEV
TSQL->PL SQL我说个有意思的题目大家玩玩吧
SQL 题目,包子有谢![转载] a PLSQL question
【征文】Oracle Advanced PL/SQL 系列Oracle SQL Tunning Problem!
mysql challengeRe: 精通SQL,VB,JAVA,C++(optional)的developer多么? (转载)
请教:PL/SQLplsql 求救--速度太慢了, 咋办呢
求教:求救,这个更新如何写?
新手求教,plsql collection 参数传入问题,非常感谢。advices please on learning Oracle
相关话题的讨论汇总
话题: partid话题: inventory话题: where话题: update话题: stockqty