PL/SQL编程

create or replace PROCEDURE test
as
counter number(3):=0;
sumResult number:=0;
BEGIN
LOOP
counter := counter+1;
sumResult := sumResult+counter;
IF counter>=100 THEN
EXIT;
END IF;
— EXIT WHEN counter>=100;
END LOOP;
dbms_output.put_line(‘result is :’||to_char(sumResult));
END;
exec test;

PL/SQL 编程,oracle 类似其他语言的一种编程,适合操作sql语句,在数据类型上不仅有一般数据库所具有的数据类型,还可以将数据库里的表里的列作为类型声明变量。

create or replace PROCEDURE test2
as
cursor testcur is select * from emp;
rowtest emp%rowtype;
begin
for rowtest in testcur
loop
dbms_output.put_line(rowtest.ename);
end loop;
end;

对于游标的基本操作(隐式游标)

用PL/SQL编程进行金额累加

create or replace PROCEDURE test2
as
cursor testcur is select * from emp where sal>800;
rowtest emp%rowtype;
sum1 number:=0;
begin
for rowtest in testcur
loop
sum1:=sum1+rowtest.sal;
dbms_output.put_line(rowtest.ename);
end loop;
dbms_output.put_line(sum1);
end;

exec test2

 

再来一些更多的例子吧,
注意 条件语句:if then end if when then
循环语句:for loop end loop
还有不要丢分号

create or replace procedure test4
as
cursor cur2 is select sal from emp where empno between 1000 and 10000;
roetest emp%rowtype;
BEGIN
for roetest in cur2
loop
if(roetest.sal<2000) then
update emp set sal =sal/0.8;
end if;
dbms_output.put_line(roetest.sal);
end loop;
exception
when others then
dbms_output.put_line(‘有问题’);
end;
exec test4;

 

写一个函数,函数和procedure不·就是as前要写return的类型吧,end前也要写return的变量。
create or replace function tes(empno1 number)
return varchar2 as
dept1 number(2);
result DEPT.DNAME%type;
begin
select deptno into dept1 from emp where empno=empno1;
select dname into result from dept where deptno=dept1;
return result;
exception
when others then
dbms_output.put_line(‘gg’);
end;
select tes(7369) from dual;
另一个函数
create or replace function fun1(emp1 in emp.empno%type)
return number
as
sal1 emp.sal%type;
begin
select sal into sal1 from emp where empno=emp1;
return sal1;
exception
when others then
dbms_output.put_line(‘gg’);
end;
select fun1(‘7369’) from dual;

一个简单的小例子
create or replace PROCEDURE tt1
as –注意这个as
begin
for i in 1..25
loop
dbms_output.put_line(i*2);
end loop;
end;
exec tt1;

因为oracle里没有像MySql中limit函数以及SQLServer中的top,故要使用伪列来实现分页的效果

如果是简单的查询前5列的内容,可以使用如下语句

select * from emp where rownum<5;

但是如果是查询5-10之间的数就不行了

如果像上面哪样写,就会出错

当生成结果集时,Oracle首先会产生一条ROWNUM为1的记录,显然不符合条件,那么同样会继续产生第二条数据,同样标识ROWNUM为1,该条记录同样继续被过滤掉,后续生成的ROWNUM依然为1,因此上述查询语句不会有任何查询结果,所以如果想要使上述结果有满足条件的结果集,必须使用子查询,代码如下

select * from(select rownum row1,emp.* from emp) where row1>=5 and row1<=10;

上面用了子查询还有将rownum用了别名,用emp.*表示剩余的列。

关于oracle的触发器

FOR EACH ROW   –说明创建的是行级触发器

:new 修饰符访问操作完成后列的值

:old 修饰符访问操作完成前列的值

找到问题了,在VC++目录中的包含文件中
默认的是
$(VCInstallDir)include
$(VCInstallDir)atlmfc\inclu
????很奇怪,重装2003居然也是这样
我改为
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(VCInstallDir)PlatformSDK\include
就好了,

谢谢大家了

 

在其他上打开资源视图

发表评论