就是set serveroutput on必须在SQlPlus工具中生效,你在其他地方用是无效的
--创建带参数的存储过程 给指定员工涨工资100,并且打印涨前和涨后的工资
create or replace procedure raisesalary(ygh in number) --可以设定字符代替员工号,如ygh,而不是一个确定的数字
as
--定义一个变量保存涨前工资
psal emp.sal%type;
--psal为定义的变量 emp.sal%type意思是指使用emp里面的sal的数据类型类型
begin
--得到涨前的薪水
select sal into psal from emp where empno=ygh ;
--得到涨后的薪水
update emp set sal=sal+100 where empno=ygh ;
--打印涨前涨后的薪水
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));
end;
/
你 commit了吗
解锁scott用户后自带表。
CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10 BYTE),
"JOB" VARCHAR2(9 BYTE),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
不知道哎
不用,这个就是接
这个的
update用来更新信息的,给员工涨100块工资,再打印输出员工涨前和涨后的工资,这不是说了,要涨工资么。不update不就等于没涨。
empno就是你建的表的员工号,也就是员工id,表的主键,你传的输入参数就是给他判断的。
应为你在命令里面执行前没有打开屏幕输出开关, 写打开,再去执行存储过程, 打开的语句set serveroutput on
关于事务属性的东西在网上可以随便搜到,这里粘贴一下,具体自己搜搜.(事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。)
举个简单例子什么情况需要同一事务,如有不正确的地方还请各位指正.比如你有两张表,分别存储员工的总体信息(总体信息中包含总工资)和工资的分项信息,现在有一个操作要更改员工分项工资,那么这里会涉及到两张表的更改,这事两张表的更改就应该放在一个事务中,以达到要么都更改成功,要么都更改不成功的状态.如果不放在一个事务里的话,你更改分项工资成功了,然后程序发生错误了,导致总工资没有更改,那么就会发生分项工资之和与总工资不相等的情况了,这显然是不希望看到的.
希望对你有帮助
储存过程语句发一下
可以用sql development
/ 在SQLPLUS命令行里面代表执行的意思
create or replace procedure raisalary(eno in number)--in 输入参数
as
psal a_testoracel.sal%type; --引用薪水的类型作为变量的类型
begin --plsql程序开始
--得到员工涨前的薪水
select sal into psal from a_testoracel where empno = eno;
update a_testoracel set sal=sal+100 where empno = eno;
dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal + 100));
end;
/
定义一个变量 类型为emp.sal字段的类型
这里声明一个变量,是为了在输出语句中直接引用这个值,就比如程序代码中的变量一样,赋值之后就可以调用了。直接是使用sal是用不了,因为你只是执行了一次查询语句,并没有保存结果。
一般来说,如果你没有定义IN 或者OUT 或默认定义为IN
declare 也可以创建一个function 但是捏 零时的用完了自动删除的
create function这个是创建在数据库里面的 用完了捏要人为删除才行
以现在的知识我的理解大概是这样的......................
这是个引用型变量,
psal emp.sal%type;
就是指psal这个变量是引用了表emp中的sal字段的类型。如果emp表中sal的类型变了,psal这个字段的类型也会跟着变化,总之,psal和表emp中sal字段类型一致。引用型变量可以不用知道该表中类型是什么,只要引用的表中的字段类型改变,定义的变量就跟着改变, 用引用型变量易于维护。
可以贴出你的代码?你创建存储过程的时候如果没有不是会报错的吗?你如果看compiler-log
发现不了错误的话,可以show error;执行看log排查错误。