update emp2 t2
set t2.ename = 'Name'
where 1 = 1
and rowid = (select rowid
from emp2 t
where empno = 23);
Allerdings ist diese Art des Updates nicht sehr effizient.
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:53140678334596
http://www.java2s.com/Tutorial/Oracle/0040__Query-Select/UnderstandingRowIdentifiersrowid.htm
http://psoug.org/definition/ROWID.htm
http://www.orafaq.com/wiki/ROWID
Donnerstag, 4. Februar 2016
Variablen, Deklaration und Definition
-- *************************************************************
-- * allgemeine SELECT * INTO - Syntax
-- *************************************************************
select
into
from
where;
-- *************************************************************
-- * Deklaration des Typs
-- * ************************************************************
declare
v_empno Number;
v_ename Varchar2(50);
v_job Varchar2(50);
begin
select empno, ename, job
into v_empno, v_ename, v_job
from emp
where empno = 1
;
--
dbms_output.put_line (v_empno || ' | ' ||
v_ename || ' | ' ||
v_job);
end;
-- *************************************************************
-- * mit dem Typ einer Tabellenspalte
-- *************************************************************
declare
-- Definitionen
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
begin
select empno, ename, job
into v_empno, v_ename, v_job
from emp
where empno = 8001
;
--
dbms_output.put_line (v_empno || ' | ' ||
v_ename || ' | ' ||
v_job);
end;
-- *************************************************************
-- * Record-Deklaration
-- *************************************************************
declare
-- Define a record
TYPE t_EmpRecord is RECORD (
v_empno emp.empno%TYPE,
v_ename emp.ename%TYPE,
v_job emp.job%TYPE);
-- Declare a variable of type record
v_Employee t_EmpRecord;
begin
select e.empno, e.ename, e.job
into v_Employee.v_empno, v_Employee.v_ename, v_Employee.v_job
from emp e
where e.empno = 8001
;
--
dbms_output.put_line (v_Employee.v_empno || ' | ' ||
v_Employee.v_ename || ' | ' ||
v_Employee.v_job);
end;
-- * allgemeine SELECT * INTO - Syntax
-- *************************************************************
select
into
from
where
--
-- *
declare
v_empno Number;
v_ename Varchar2(50);
v_job Varchar2(50);
begin
select empno, ename, job
into v_empno, v_ename, v_job
from emp
where empno = 1
;
--
dbms_output.put_line (v_empno || ' | ' ||
v_ename || ' | ' ||
v_job);
end;
--
-- *************************************************************
declare
-- Definitionen
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
begin
select empno, ename, job
into v_empno, v_ename, v_job
from emp
where empno = 8001
;
--
dbms_output.put_line (v_empno || ' | ' ||
v_ename || ' | ' ||
v_job);
end;
-- *************************************************************
-- * Record-Deklaration
-- *************************************************************
declare
-- Define a record
TYPE t_EmpRecord is RECORD (
v_empno emp.empno%TYPE,
v_ename emp.ename%TYPE,
v_job emp.job%TYPE);
-- Declare a variable of type record
v_Employee t_EmpRecord;
begin
select e.empno, e.ename, e.job
into v_Employee.v_empno, v_Employee.v_ename, v_Employee.v_job
from emp e
where e.empno = 8001
;
--
dbms_output.put_line (v_Employee.v_empno || ' | ' ||
v_Employee.v_ename || ' | ' ||
v_Employee.v_job);
end;
Donnerstag, 10. September 2015
Tabelle mittels For..Loop mit 100 Datensätzen befüllen
DECLARE
p_EMPNO number(4) := 0;
p_ENAME varchar2(10) := 'Test';
p_AENDERUNGSZEITSTEMPEL timestamp(6) := sysdate;
p_AENDERUNGSKENNZEICHEN varchar2(2) := 'I';
BEGIN
FOR i IN 1 .. 100 LOOP
p_EMPNO := p_EMPNO + 1;
INSERT
INTO CT_EMP1
(
EMPNO,
ENAME,
AENDERUNGSZEITSTEMPEL,
AENDERUNGS_KENNZEICHEN
)
VALUES
(
p_EMPNO,
p_ENAME,
p_AENDERUNGSZEITSTEMPEL,
p_AENDERUNGSKENNZEICHEN
);
END LOOP for_loop;
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
raise_application_error (-20001,'Fehler beim Insert durch Schluesselverletzung.');
WHEN OTHERS THEN
dbms_output.put_line('Fehler beim Ausfuehren des Kommandos.');
RAISE;
END;
Hier ein weiterer Link zur automatischen Testdatengenerierung:
https://www.besserdich.com/oracle/scripting/testdatengenerierung-zeilen-generator-row-generator-in-oracle/
p_EMPNO number(4) := 0;
p_ENAME varchar2(10) := 'Test';
p_AENDERUNGSZEITSTEMPEL timestamp(6) := sysdate;
p_AENDERUNGSKENNZEICHEN varchar2(2) := 'I';
BEGIN
FOR i IN 1 .. 100 LOOP
p_EMPNO := p_EMPNO + 1;
INSERT
INTO CT_EMP1
(
EMPNO,
ENAME,
AENDERUNGSZEITSTEMPEL,
AENDERUNGS_KENNZEICHEN
)
VALUES
(
p_EMPNO,
p_ENAME,
p_AENDERUNGSZEITSTEMPEL,
p_AENDERUNGSKENNZEICHEN
);
END LOOP for_loop;
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
raise_application_error (-20001,'Fehler beim Insert durch Schluesselverletzung.');
WHEN OTHERS THEN
dbms_output.put_line('Fehler beim Ausfuehren des Kommandos.');
RAISE;
END;
Hier ein weiterer Link zur automatischen Testdatengenerierung:
https://www.besserdich.com/oracle/scripting/testdatengenerierung-zeilen-generator-row-generator-in-oracle/
Donnerstag, 26. März 2015
Dynamisch mit dem DBMS_SQL-Package
DECLARE
--
v_Cursor NUMBER;
v_CmdString VARCHAR2(5000);
v_Ret INTEGER;
--
BEGIN
--
v_Cursor := DBMS_SQL.OPEN_CURSOR;
v_CmdString := 'rename EMP to emp_tmp';
DBMS_SQL.PARSE(v_Cursor, v_CmdString, DBMS_SQL.NATIVE);
v_Ret := DBMS_SQL.EXECUTE(v_Cursor);
DBMS_SQL.CLOSE_CURSOR(v_Cursor);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_Cursor);
DBMS_OUTPUT.PUT_LINE('Fehler beim Ausfuehren des Kommandos');
RAISE;
--
END;
/
http://www.java2s.com/Tutorial/Oracle/0601__System-Packages/AnexampleofusingDBMSSQLOPENCURSOR.htm
http://www.java2s.com/Code/Oracle/System-Packages/FirstDBMSSQLExample.htm
http://docstore.mik.ua/orelly/oracle/bipack/ch02_05.htm
http://psoug.org/reference/dbms_sql.html
--
v_Cursor NUMBER;
v_CmdString VARCHAR2(5000);
v_Ret INTEGER;
--
BEGIN
--
v_Cursor := DBMS_SQL.OPEN_CURSOR;
v_CmdString := 'rename EMP to emp_tmp';
DBMS_SQL.PARSE(v_Cursor, v_CmdString, DBMS_SQL.NATIVE);
v_Ret := DBMS_SQL.EXECUTE(v_Cursor);
DBMS_SQL.CLOSE_CURSOR(v_Cursor);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_Cursor);
DBMS_OUTPUT.PUT_LINE('Fehler beim Ausfuehren des Kommandos');
RAISE;
--
END;
/
Links
http://www.toadworld.com/products/toad-for-oracle/w/toad_for_oracle_wiki/231.dbms-sql-vs-execute-immediate.aspxhttp://www.java2s.com/Tutorial/Oracle/0601__System-Packages/AnexampleofusingDBMSSQLOPENCURSOR.htm
http://www.java2s.com/Code/Oracle/System-Packages/FirstDBMSSQLExample.htm
http://docstore.mik.ua/orelly/oracle/bipack/ch02_05.htm
http://psoug.org/reference/dbms_sql.html
Mittwoch, 25. März 2015
SQL mal wieder ein wenig dynamischer
declare
procedure run(p_sql varchar2) as
begin
execute immediate p_sql;
end;
begin
run('rename EMP to emp_tmp');
run('rename emp_tmp to emp');
end;
http://www.insidesql.org/blogs/frankkalis/2004/07/16/dynamisches-sql-fluch-und-segen
procedure run(p_sql varchar2) as
begin
execute immediate p_sql;
end;
begin
run('rename EMP to emp_tmp');
run('rename emp_tmp to emp');
end;
Dazu noch ein paar nützliche Informationen:
http://use-the-index-luke.com/de/sql/mythen/dynamisches-sql-ist-langsamhttp://www.insidesql.org/blogs/frankkalis/2004/07/16/dynamisches-sql-fluch-und-segen
Dienstag, 3. März 2015
Join über vier Tabellen
Dieses Beispiel beruht auf dem SQL - Wikipedia ER-Diagramm:
http://de.wikipedia.org/wiki/SQL#Sprachelemente_und_Beispiele
Um anzuzeigen, welche Vorlesungen die Studenten besuchen und deren zugeordnete Professoren, kann diese Abfrage verwendet werden:
select s.matrnr
, s.name
, v.vorlnr
, v.titel
, p.persnr
, p.name
from Student s, hoert h, Vorlesung v, Professor p
where s.matrnr = h.matrnr
and h.vorlnr = v.vorlnr
and v.persnr = p.persnr
order by 2
MATRNR NAME VORLNR TITEL PERSNR NAME
26120 Fichte 5001 ET 15 Tesla
26120 Fichte 5045 DB 12 Wirth
25403 Jonas 5001 ET 15 Tesla
http://www.dba-oracle.com/tips_oracle_left_outer_join.htm
http://de.wikipedia.org/wiki/SQL#Sprachelemente_und_Beispiele
Um anzuzeigen, welche Vorlesungen die Studenten besuchen und deren zugeordnete Professoren, kann diese Abfrage verwendet werden:
select s.matrnr
, s.name
, v.vorlnr
, v.titel
, p.persnr
, p.name
from Student s, hoert h, Vorlesung v, Professor p
where s.matrnr = h.matrnr
and h.vorlnr = v.vorlnr
and v.persnr = p.persnr
order by 2
MATRNR NAME VORLNR TITEL PERSNR NAME
26120 Fichte 5001 ET 15 Tesla
26120 Fichte 5045 DB 12 Wirth
25403 Jonas 5001 ET 15 Tesla
Hier noch ein Beispiel zum Left Outer Join (wg. BURLESON Consulting):
http://www.dba-oracle.com/tips_oracle_left_outer_join.htm
Dienstag, 16. Dezember 2014
Dynamisch Tabellen abfragen und Datensätze zählen
set serveroutput on
--
DECLARE
CURSOR c_trig IS
SELECT table_name
FROM tabs
WHERE 1=1
AND table_name like 'T_%'
;
v_zaehler number;
BEGIN
FOR r IN c_trig
LOOP
-- execute immediate 'TRUNCATE TABLE '||r.table_name;
execute immediate 'select count(*) from ' || r.table_name into v_zaehler;
DBMS_OUTPUT.PUT_LINE(r.table_name || ' : ' || v_zaehler);
END LOOP;
END;
/
--
DECLARE
CURSOR c_trig IS
SELECT table_name
FROM tabs
WHERE 1=1
AND table_name like 'T_%'
;
v_zaehler number;
BEGIN
FOR r IN c_trig
LOOP
-- execute immediate 'TRUNCATE TABLE '||r.table_name;
execute immediate 'select count(*) from ' || r.table_name into v_zaehler;
DBMS_OUTPUT.PUT_LINE(r.table_name || ' : ' || v_zaehler);
END LOOP;
END;
/
Abonnieren
Posts (Atom)