Continuación %ROWTYPE

A few days ago, I posted an entry, Anchored Declarations – %TYPE and %ROWTYPE. That article talked about using anchored declarations in your PL/SQL code.

PeteF ask a couple of questions about that post:

Inglés:

Nice little article – I have a couple of questions… Is there any way to utilise the %rowtype attribute from within a trigger i.e. can I easily populate a rowtype variable with all the old (or new) columns in one shot? Number two – is there an easy way to write the rowtype variable back to the DB without having to mention every column name? As you say in your article – all sacrilege I’m sure but hey 😉 tia Pete

Español

Niza poco el artículo – Tengo un par de preguntas … ¿Hay alguna forma de utilizar el atributo de rowtype% dentro de un disparador es decir que fácilmente puede rellenar el rowtype variable con todas las viejas (o nuevas) las columnas de una sola? Número dos, hay una forma sencilla de escribir la variable de rowtype al PP, sin tener que mencionar el nombre de columna? Como usted dice en su artículo, todos los sacrilegio estoy seguro, pero bueno;) Pete tia

Pete – No puedo ayudarle en la pregunta # 1. Por lo que sé, usted tiene que hacer referencia a cada una de las columnas por separado cuando se utiliza :new y :old. Hay que ser agradable ser capaz de ceder todo en una marejada foop pero por desgracia, :new y :old son seudo columnas, en contraposición a los registros.

Sobre la pregunta, el número 2, la respuesta es afirmativa. Puedes seleccionar una rowtype variables, hacer algunos cambios y, a continuación, inserte de nuevo.

declare
v_emp_rec employees%rowtype;
begin
select *
into v_emp_rec
from employees
where rownum = 1;

v_emp_rec.last_name := 'Lewis';
v_emp_rec.first_name := 'Cunningham';
v_emp_rec.email := 'lewis@email.com';
v_emp_rec.employee_id := 9999;

insert into employees values v_emp_rec;

end;
/

En ésta, que ha cambiado los campos requeridos (PK y el mensaje que es una clave única) y el nombre y, a continuación, inserta la fila como una fila nueva.

Schwierman también publicó un comentario:

Inglés:

Number two…

Have you tried the bulk collect update statement. I am using a table array, but, maybe a rowtype would work.

FORALL x IN 1 .. ptbl_lp_io.COUNT SAVE EXCEPTIONS
UPDATE lp
SET ROW = ptbl_lp_io (x)
WHERE lp_id = ltbl_lp_id (x);

Español

Número dos …

Has intentado recoger la mayor parte de actualización. Estoy utilizando una tabla matriz, pero tal vez un rowtype de trabajo.

FORALL x IN 1 .. ptbl_lp_io.COUNT SAVE EXCEPTIONS
UPDATE lp
SET ROW = ptbl_lp_io (x)
WHERE lp_id = ltbl_lp_id (x);

Creo que se pete responder a la segunda pregunta del uso de bulk collect. Un completo ejemplo de ello es:

SQL> CREATE TABLE employees_new AS SELECT * FROM employees WHERE ROWNUM < 1;

Table created.

SQL> SELECT COUNT(*) FROM EMPLOYEES;

COUNT(*)
----------
107

SQL> SELECT COUNT(*) FROM employees_new;

COUNT(*)
----------
0

SQL> DECLARE
2
3 type arr_emp_recs IS TABLE OF employees % rowtype;
4 v_emp_rec arr_emp_recs;
5 BEGIN
6
7 SELECT *
8 bulk collect
9 INTO v_emp_rec
10 FROM employees;
11
12 FORALL x IN 1..v_emp_rec.COUNT
13 INSERT INTO employees_new VALUES v_emp_rec(x);
14
15 COMMIT;
16
17 END;
18 /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM employees_new;

COUNT(*)
----------
107

SQL>

You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Comments are closed.