<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=UD1_DAI-C8-EC._Fonaments_del_llenguatge_PL%2FSQL</id>
	<title>UD1 DAI-C8-EC. Fonaments del llenguatge PL/SQL - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=UD1_DAI-C8-EC._Fonaments_del_llenguatge_PL%2FSQL"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=UD1_DAI-C8-EC._Fonaments_del_llenguatge_PL/SQL&amp;action=history"/>
	<updated>2026-08-30T10:22:36Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=UD1_DAI-C8-EC._Fonaments_del_llenguatge_PL/SQL&amp;diff=197154&amp;oldid=prev</id>
		<title>Joan: /* Introducció al llenguatge PL/SQL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=UD1_DAI-C8-EC._Fonaments_del_llenguatge_PL/SQL&amp;diff=197154&amp;oldid=prev"/>
		<updated>2011-09-28T14:49:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Introducció al llenguatge PL/SQL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció al llenguatge PL/SQL=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Introducció al llenguatge PL/SQL&lt;br /&gt;
================================&lt;br /&gt;
&lt;br /&gt;
Blocs PL/SQL&lt;br /&gt;
&lt;br /&gt;
[DECLARE&lt;br /&gt;
	&amp;lt;declaracions&amp;gt;]&lt;br /&gt;
BEGIN&lt;br /&gt;
	&amp;lt;ordres&amp;gt;&lt;br /&gt;
[EXCEPTION&lt;br /&gt;
	&amp;lt;gestió d'excepcions&amp;gt; ]&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
	v_num_empleats NUMBER(2);&lt;br /&gt;
BEGIN&lt;br /&gt;
	INSERT INTO depart VALUES (99,'PROVISIONAL',NULL);&lt;br /&gt;
	UPDATE emple SET dept_no=99 WHERE dept_no=20;&lt;br /&gt;
	v_num_empleats := SQL%ROWCOUNT;&lt;br /&gt;
	DELETE FROM depart WHERE dept_no=20;&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE(v_num_empleats || ' empleats ubicats en PROVISIONAL');&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN OTHERS THEN&lt;br /&gt;
		ROLLBACK;&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20000, 'Error aplicació');&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Definició de dades compatibles amb SQL&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
	import NUMBER(8,2);&lt;br /&gt;
	comptador NUMBER(2) DEFAULT 0;&lt;br /&gt;
	nom CHAR(20) NOT NULL := 'MIQUEL';&lt;br /&gt;
	nou VARCHAR2(15);&lt;br /&gt;
BEGIN&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
2. Estructures de control&lt;br /&gt;
&lt;br /&gt;
IF &amp;lt;condició1&amp;gt; THEN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
ELSIF &amp;lt;condició2&amp;gt; THEN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
...&lt;br /&gt;
ELSE&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END IF;&lt;br /&gt;
&lt;br /&gt;
WHILE &amp;lt;condició&amp;gt; LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
FOR&amp;lt;variable&amp;gt; IN &amp;lt;mínim&amp;gt;..&amp;lt;màxim&amp;gt; LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
	...&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
3.Ús de cursors&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
	v_cog VARCHAR(10);&lt;br /&gt;
	v_ofici VARCHAR(10);&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT cognom,ofici INTO v_cog, v_ofici&lt;br /&gt;
	FROM EMPLE WHERE EMP_NO=7900;&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE(v_cog || '*' || v_ofici);&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
4. Gestió d'excepcions&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
col1 varchar2(50)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
	v_cog VARCHAR(10);&lt;br /&gt;
	v_ofici VARCHAR(10);&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT cognom,ofici INTO v_cog, v_ofici&lt;br /&gt;
	FROM EMPLE WHERE EMP_NO=7900;&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE(v_cog || '*' || v_ofici);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	INSERT INTO temp(col1) VALUES('ERROR no hi ha dades');&lt;br /&gt;
	WHEN TOO_MANY_ROWS THEN&lt;br /&gt;
	INSERT INTO temp(col1) VALUES('ERROR massa dades');&lt;br /&gt;
	WHEN OTHERS THEN&lt;br /&gt;
	RAISE_APPLICATION_ERROR(-20000, 'Error aplicació');&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
5. Us de procediments&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE veure_client(nomcli VARCHAR2)&lt;br /&gt;
AS&lt;br /&gt;
	nifcli VARCHAR2(10);&lt;br /&gt;
	domicli VARCHAR2(15);&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT nif, domicili INTO nifcli, domicli FROM CLIENTS&lt;br /&gt;
	WHERE nom=nomcli;&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE('Nom: ' || nomcli || ' Domicili: ' || domicli);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE('no sha trobat el client '||nomcli);&lt;br /&gt;
END VEURE_CLIENT;&lt;br /&gt;
/ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Ús de dates==&lt;br /&gt;
*http://www.exes.es/ManSQL/index.asp?Pg=sql_plsql_3.htm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert into prova values(1,'03/12/1969');&lt;br /&gt;
insert into prova values(2,'1969/12/03');&lt;br /&gt;
insert into prova values(3,'03-12-1969');&lt;br /&gt;
insert into prova values(3,'03-12-1969 12:05:23'); NO&lt;br /&gt;
insert into prova values(3,'03-12-1969 12h05m23s'); NO&lt;br /&gt;
insert into prova values(1,'03/12/1969 12:05:23'); NO&lt;br /&gt;
&lt;br /&gt;
select * from prova;&lt;br /&gt;
&lt;br /&gt;
select sysdate from dual;&lt;br /&gt;
&lt;br /&gt;
TO_CHAR (número | fecha [,’fmt’]) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
select TO_CHAR(sysdate,'yyyy') from dual;&lt;br /&gt;
select TO_CHAR(sysdate,'yyyy/mm/dd') from dual;&lt;br /&gt;
select TO_CHAR(sysdate,'hh24 mi ss') from dual;&lt;br /&gt;
select TO_CHAR(sysdate,'hh24.mi.ss') from dual;&lt;br /&gt;
&lt;br /&gt;
select TO_CHAR(sysdate,'hh24.mi.ss') from dual;&lt;br /&gt;
&lt;br /&gt;
'avui som 28 de setembre del 2010'&lt;br /&gt;
select 'avui som '|| TO_CHAR(sysdate,'dd')||' de ' || TO_CHAR(sysdate,'month') || ' del '|| TO_CHAR(sysdate,'yyyy') from dual;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fonaments del llenguatge PL/SQL=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fonaments del llenguatge PL/SQL&lt;br /&gt;
===============================&lt;br /&gt;
&lt;br /&gt;
1. Tipus de dades b�siques&lt;br /&gt;
CHAR(L)&lt;br /&gt;
VARCHAR2(L)&lt;br /&gt;
LONG(L)&lt;br /&gt;
NUMBER(P,E)&lt;br /&gt;
BINARY_INTEGER&lt;br /&gt;
PLS_INTEGER&lt;br /&gt;
BOOLEAN&lt;br /&gt;
DATE&lt;br /&gt;
RAW(L)&lt;br /&gt;
LONG RAW&lt;br /&gt;
ROWID&lt;br /&gt;
&lt;br /&gt;
Longituds m�ximes dels tipus:&lt;br /&gt;
&lt;br /&gt;
TIPUS		VARIABLE PL/SQL		CAMP ORACLE8&lt;br /&gt;
VARCHAR2	32767 bytes		4000 bytes&lt;br /&gt;
CHAR		32767 bytes		2000 bytes&lt;br /&gt;
LONG		32767 bytes		2 Gb&lt;br /&gt;
RAW		32767 bytes		2000 bytes&lt;br /&gt;
LONG RAW	32767 bytes		2 Gb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Variables&lt;br /&gt;
DECLARE&lt;br /&gt;
import NUMBER(8,2);&lt;br /&gt;
comptador NUMBER(2,0) := 0;&lt;br /&gt;
nom CHAR(20) NOT NULL := 'MIquel';&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Atributs %TYPE i %ROWTYPE&lt;br /&gt;
&lt;br /&gt;
--Declara la variable total del mateix tipus que la variable import definida pr�viament&lt;br /&gt;
total import%TYPE; &lt;br /&gt;
--declara la variable nom_deutor del mateix tipus que el camp nom dela taula clients&lt;br /&gt;
nom_deutor CLIENTS.nom%TYPE;&lt;br /&gt;
--%ROWTYPE crea una variable de registre els camps del qual es corresponen als camps d'una taula o vista de la base de dades&lt;br /&gt;
deutor CLIENTS%ROWTYPE;&lt;br /&gt;
&lt;br /&gt;
3. Operadors&lt;br /&gt;
-assignaci�: Edat := 20;&lt;br /&gt;
-l�gics: AND, OR, NOT&lt;br /&gt;
Les sent�ncies, a part de ser TRUE o FALSE, poden ser NULL (no sabem l'estat)&lt;br /&gt;
&lt;br /&gt;
TRUE AND NULL -&amp;gt; NULL&lt;br /&gt;
FALSE AND NULL -&amp;gt; FALSE&lt;br /&gt;
NULL AND NULL -&amp;gt; NULL&lt;br /&gt;
&lt;br /&gt;
TRUE OR NULL -&amp;gt; TRUE&lt;br /&gt;
FALSE OR NULL -&amp;gt; NULL&lt;br /&gt;
NULL OR NULL -&amp;gt; NULL&lt;br /&gt;
&lt;br /&gt;
NOT NULL -&amp;gt; NULL&lt;br /&gt;
&lt;br /&gt;
-Concatenaci�: ||&lt;br /&gt;
-Comparaci�: =, !=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, IS NULL, BETWEEN, LIKE IN (igual que en SQL)&lt;br /&gt;
-Aritm�tics: +, -, *, /, **&lt;br /&gt;
&lt;br /&gt;
4. Funcions&lt;br /&gt;
En PL/SQL es poden utilitzar totes les funcions de SQL: AVG, MIN, MAX, COUNT, SUM, STDDEV&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DAY, DD MONTH &amp;quot; a les &amp;quot; YYYY:HH24:MI:SS'));&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
5. Estructures de control&lt;br /&gt;
&lt;br /&gt;
IF &amp;lt;condici�&amp;gt; THEN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
END IF;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IF &amp;lt;condici�&amp;gt; THEN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
ELSIF &amp;lt;condici�2&amp;gt; THEN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;&lt;br /&gt;
ELSE&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;&lt;br /&gt;
END IF;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
	IF &amp;lt;condici�&amp;gt; THEN&lt;br /&gt;
		EXIT;&lt;br /&gt;
	END IF;&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
WHILE &amp;lt;condici�&amp;gt; LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
FOR &amp;lt;variablecontrol&amp;gt; IN &amp;lt;valorinici&amp;gt;..&amp;lt;valorfinal&amp;gt; LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
	...;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
FOR &amp;lt;variablecontrol&amp;gt; IN REVERSE &amp;lt;valorinici&amp;gt;..&amp;lt;valorfinal&amp;gt; LOOP&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
	...;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR i IN REVERSE 1..3 LOOP&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(i);&lt;br /&gt;
END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
...&lt;br /&gt;
GOTO inserir_fila;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;&amp;lt;inserir_fila&amp;gt;&amp;gt; -- �s una etiqueta&lt;br /&gt;
INSERT INTO EMPLEAT VALUES...&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
Escriure la cadena 'HOLA' a l'inrev�s:&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
r_cadena VARCHAR2(10);&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR i IN REVERSE 1..LENGTH('HOLA') LOOP&lt;br /&gt;
r_cadena := r_cadena || SUBSTR('HOLA',i,1);&lt;br /&gt;
END LOOP;&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(r_cadena);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Escriure la cadena 'HOLA' a l'inrev�s, d'una altra manera:&lt;br /&gt;
&lt;br /&gt;
DECLARE&lt;br /&gt;
r_cadena VARCHAR2(10);&lt;br /&gt;
i BINARY_INTEGER;&lt;br /&gt;
BEGIN&lt;br /&gt;
i := LENGTH('HOLA');&lt;br /&gt;
WHILE i&amp;gt;=1 LOOP&lt;br /&gt;
r_cadena := r_cadena || SUBSTR('HOLA',i,1);&lt;br /&gt;
i := i - 1;&lt;br /&gt;
END LOOP;&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(r_cadena);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
6. Subprogrames: procediments i funcions&lt;br /&gt;
&lt;br /&gt;
PROCEDURE &amp;lt;nomprocediment&amp;gt; [(&amp;lt;llista_parametres&amp;gt;)]&lt;br /&gt;
IS&lt;br /&gt;
	&amp;lt;declaracions&amp;gt;;&lt;br /&gt;
BEGIN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	&amp;lt;excepcions&amp;gt;;&lt;br /&gt;
END [&amp;lt;nomprocediment&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
llista de par�metres:&lt;br /&gt;
&amp;lt;nomvariable&amp;gt; [IN | OUT | IN OUT] &amp;lt;tipus_dada&amp;gt; [{ := | DEFAULT} &amp;lt;valor&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Per a crear el procediment:&lt;br /&gt;
CREATE [OR REPLACE] PROCEDURE &amp;lt;nomprocediment&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE canviar_ofici(&lt;br /&gt;
num_empleat NUMBER, --en els par�metres no s'especifica el tamany&lt;br /&gt;
nou_ofici VARCHAR2&lt;br /&gt;
AS&lt;br /&gt;
anterior_ofici EMPLE.ofici%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
SELECT ofici INTO anterior_ofici FROM EMPLE WHERE emp_no=num_empleat;&lt;br /&gt;
UPDATE EMPLE SET ofici=nou_ofici WHERE emp_no=num_empleat;&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(num_empleat || '*Ofici anterior: ' || anterior_ofici || '*Ofici nou: ' || nou_ofici );&lt;br /&gt;
END canviar_ofici;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
EXECUTE canviar_ofici(7902, 'DIRECTOR');&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE canv_ofici(v_cognom VARCHAR2,nou_ofici VARCHAR2)&lt;br /&gt;
IS&lt;br /&gt;
num_empleat EMPLE.emp_no%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
SELECT emp_no INTO num_empleat FROM EMPLE WHERE cognom=v_cognom;&lt;br /&gt;
canviar_ofici(num_empleat, nou_ofici); --cridem al procediment creat anteriorment&lt;br /&gt;
END canv_ofici;&lt;br /&gt;
&lt;br /&gt;
EXECUTE canv_ofici('FERN�NDEZ', 'ANALISTA');&lt;br /&gt;
&lt;br /&gt;
7. Subprogrames: funcions&lt;br /&gt;
&lt;br /&gt;
FUNCTION &amp;lt;nomfunci�&amp;gt; ([&amp;lt;llista_parametres&amp;gt;])&lt;br /&gt;
RETURN &amp;lt;tipus de valor tornat&amp;gt;&lt;br /&gt;
IS&lt;br /&gt;
	&amp;lt;declaracions&amp;gt;;&lt;br /&gt;
BEGIN&lt;br /&gt;
	&amp;lt;instruccions&amp;gt;;&lt;br /&gt;
	RETURN &amp;lt;expressi�&amp;gt;;&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	&amp;lt;excepcions&amp;gt;;&lt;br /&gt;
END [&amp;lt;nomfunci�&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION trobar_num_empleat(v_cognom VARCHAR2)&lt;br /&gt;
RETURN REAL&lt;br /&gt;
AS&lt;br /&gt;
num_empleat EMPLE.emp_no%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
SELECT emp_no INTO num_empleat FROM EMPLE WHERE cognom=v_cognom;&lt;br /&gt;
RETURN num_empleat;&lt;br /&gt;
END trobar_num_empleat;&lt;br /&gt;
&lt;br /&gt;
per cridar a una funci� hem de pensar que el resultat del la funci� s'ha d'assignar a una variable (o b� utilitzar-la en una expressi�):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;variable&amp;gt; := &amp;lt;nomfuncio&amp;gt;(par�metres);&lt;br /&gt;
&lt;br /&gt;
BEGIN DBMS_OUTPUT.PUT_LINE(trobar_num_empleat('MU�OZ')); END;&lt;br /&gt;
&lt;br /&gt;
8. Par�metres&lt;br /&gt;
Els subprogrames utilitzen par�metres per passar i rebre informaci�.&lt;br /&gt;
Els par�metres poden ser d'entrada (IN), de sortida (OUT), i d'entrada i de sortida (IN OUT).&lt;br /&gt;
&lt;br /&gt;
Tipus IN:&lt;br /&gt;
-permet passar valors a un subprograma&lt;br /&gt;
-dins del subprograma, el valor actua com una constant, �s a dir, no se li pot assignar cap valor.&lt;br /&gt;
-el par�metre actual pot ser una variable, constant, literal o expressi�.&lt;br /&gt;
&lt;br /&gt;
Tipus OUT:&lt;br /&gt;
-permet retornar valors al bloc que va cridar al subprograma.&lt;br /&gt;
-dins del subprograma, el par�metre actua com una variable no inicialitzada.&lt;br /&gt;
-no pot intervenir en cap expressi�, excepte per agafar un valor.&lt;br /&gt;
-el par�metre actual ha de ser una variable.&lt;br /&gt;
&lt;br /&gt;
Tipus IN oUT:&lt;br /&gt;
-permet passar un valor inicial i retornar un valor actualitzat&lt;br /&gt;
-dins del subprograma, el par�metre actua com una variable inicialitzada.&lt;br /&gt;
-pot intervenir en altres expressions i pot agafar nous valors.&lt;br /&gt;
-el par�metre actual ha de ser una variable.&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE canviar_divises(&lt;br /&gt;
  quant_euros IN NUMBER,&lt;br /&gt;
  canvi_actual IN NUMBER,&lt;br /&gt;
  quant_comis IN OUT NUMBER,&lt;br /&gt;
  quant_divises OUT NUMBER)&lt;br /&gt;
AS&lt;br /&gt;
  pct_comis NUMBER(3,2) DEFAULT 0.2;&lt;br /&gt;
  minim_comis NUMBER(6) DEFAULT 3;&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF quant_comis IS NULL THEN&lt;br /&gt;
     quant_comis := GREATEST(quant_euros / 100 * pct_comis,minim_comis);&lt;br /&gt;
  END IF;&lt;br /&gt;
  quant_divises := (quant_euros - quant_comis)/canvi_actual;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE provar_canvi_divises(&lt;br /&gt;
  euros NUMBER,&lt;br /&gt;
  canvi NUMBER)&lt;br /&gt;
AS&lt;br /&gt;
  v_comis NUMBER(9);&lt;br /&gt;
  v_divises NUMBER(9);&lt;br /&gt;
BEGIN&lt;br /&gt;
  canviar_divises(euros,canvi,v_comis,v_divises);&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE('Euros: ' || TO_CHAR(euros,'999999.999'));&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE('Preu divisa: ' || TO_CHAR(canvi,'999999.999'));&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE('Euros comissi�: ' || TO_CHAR(v_comis,'999999.999'));&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE('Quantitat divises: ' || TO_CHAR(v_divises,'999999.999'));&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; EXECUTE provar_canvi_divises(1000,1.24)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Autor}}, setembre 2009 - setembre 2010&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>