2013-10-02 13 views
5

In realtà io sono abbastanza nuovo a PL/SQLSQL Fiddle Errore uscita

ho creato la seguente tabella utilizzando Oracle PL/SQL in SQL Fiddle

create table Employee(name varchar2(100),id integer, salary integer,PRIMARY KEY(id)); 
insert into Employee(name,id,salary) values('sa',94,100); 
insert into Employee(name,id,salary) values('pr',88,150); 
insert into Employee(name,id,salary) values('ji',33,900); 
insert into Employee(name,id,salary) values('na',24,880); 
insert into Employee(name,id,salary) values('po',65,770); 
insert into Employee(name,id,salary) values('ri',69,910); 
insert into Employee(name,id,salary) values('uj',12,650); 
insert into Employee(name,id,salary) values('ad',43,440); 
insert into Employee(name,id,salary) values('sam',40,550); 

ho eseguito la seguente domanda

DECLARE 
employee_record Employee%ROWTYPE; 
BEGIN 
select * into employee_record from Employee where id>90; 
dbms_output.put_line(employee_record.name||' '||employee_record.id||' '||employee_record.salary); 
END; 
/

sto ottenendo il seguente output

Record Count: 0; Execution Time: 2ms 

Dovrebbe stampare i valori presenti nel record del dipendente, giusto? C'è qualcosa di sbagliato nella mia query sql o qualche problema con sql fiddle non è in grado di visualizzare dbms_output?

+6

No, SQL Fiddle volontà non stampare nulla perché non è stato codificato in questo modo. Se scarichi Oracle (c'è una versione gratuita) e usi un client diverso per stamparlo, otterrai un risultato. – Ben

+0

Grazie mille. Posso comunque verificare la mia risposta in sql fiddle? – user2133404

+0

In realtà non hanno eseguito una query, ma un blocco PL/SQL di codice :) Per rispondere alla tua domanda, basta necessario eseguire la query per ottenere i risultati: SELECT * FROM Impiegato WHERE id> 90; controlla questo: http://sqlfiddle.com/#!4/7417b5/7 –

risposta

12

È necessario emulare dbms_output.put_line :)

schema:

create table Employee(
    name varchar2(100), 
    id integer, 
    salary integer, 
    PRIMARY KEY(id) 
); 

insert into Employee(name,id,salary) values('sa',94,100); 
insert into Employee(name,id,salary) values('pr',88,150); 
insert into Employee(name,id,salary) values('ji',33,900); 
insert into Employee(name,id,salary) values('na',24,880); 
insert into Employee(name,id,salary) values('po',65,770); 
insert into Employee(name,id,salary) values('ri',69,910); 
insert into Employee(name,id,salary) values('uj',12,650); 
insert into Employee(name,id,salary) values('ad',43,440); 
insert into Employee(name,id,salary) values('sam',40,550); 

create table dbmsoutput (
    pos int, 
    mes varchar2(4000) 
); 

SQL:

DECLARE 
    employee_record Employee%ROWTYPE; 
    procedure put_line(p_mes in varchar2) is 
    v_pos int; 
    begin 
    select count(0) into v_pos from dbmsoutput; 
    insert into dbmsoutput (pos, mes) values (v_pos, p_mes); 
    end; 
BEGIN 
put_line('Hello! This code is powered by dbms_output emulator :)'); 
-- Your code here: 
select * into employee_record from Employee where id>90; 
put_line(employee_record.name||' '||employee_record.id||' '||employee_record.salary); 
-- 
put_line('Bye!'); 
END; 
/


SELECT mes FROM dbmsoutput order by pos 

fiddle

5

Proprio come una curiosità davvero, possibile ottenere limitate dbms_output risultati da SQL Fiddle, ma è necessario una funzione per estrarre le linee tamponate e restituirli in una forma è possibile selezionare. Questo utilizza una tabella di pipeline:

create type t_lines as table of varchar2(4000) 
/

create or replace function get_lines 
return t_lines pipelined is 
    lines dbms_output.chararr; 
    numlines integer; 
begin 
    numlines := 999; 
    dbms_output.get_lines(lines, numlines); 
    if numlines > 0 then 
    for i in 1..numlines loop 
     pipe row (lines(i)); 
    end loop; 
    else 
    pipe row ('No data'); 
    end if; 
end; 
/

E poi, dopo tutto quello che avete emissione dbms_output.put_line chiamate:

select * from table(get_lines); 

Demo. E vedi dbms_output documentation per vedere cosa fa la sua procedura get_lines e come si riferisce alle tue chiamate put_lines.

Ma solo perché si può fare qualcosa, non significa necessariamente che si dovrebbe . Questo è imbarazzante e non è scalabile, ma nemmeno prova ad imparare PL/SQL attraverso SQL Fiddle.

Vorrei seguire la raccomandazione di Ben per ottenere il proprio database con cui giocare, ma ti suggerisco di guardare uno pre-built VM image che puoi eseguire in VirtualBox, il che ti fa risparmiare molto tempo nell'impostazione - non lo fai devi preoccuparti di come installare il software Oracle o creare e configurare un database, è solo pronto per l'uso e puoi buttarlo via o ricominciare facilmente se le cose vanno male.

Problemi correlati