2013-10-02 11 views
5

Właściwie jestem zupełnie nowy w PL/SQLSQL Fiddle Błąd wyjścia

stworzyłem poniższą tabelę przy użyciu Oracle PL/SQL w 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); 

I wykonywane następujące zapytanie

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; 
/

Otrzymuję następujące dane wyjściowe:

Record Count: 0; Execution Time: 2ms 

Powinien wydrukować wartości obecne w rekordzie pracownika, prawda? Czy coś jest nie tak w zapytaniu sql lub jakiś problem z fiddle sql niezdolny do wyświetlania dbms_output?

+6

Nie, SQL Fiddle nie drukuje nic, bo nie zostało to zakodowane w ten sposób. Jeśli pobierzesz Oracle (dostępna jest darmowa wersja) i użyjesz innego klienta do wydrukowania, otrzymasz dane wyjściowe. – Ben

+0

Wielkie dzięki. Czy mimo to mogę zweryfikować moją odpowiedź w języku fiddle sql? – user2133404

+0

Właściwie nie wykonałeś zapytania, ale blok kodu PL/SQL :) Aby odpowiedzieć na twoje pytanie, wystarczy uruchomić zapytanie, aby uzyskać wyniki: SELECT * FROM Employee WHERE id> 90; sprawdź to: http://sqlfiddle.com/#!4/7417b5/7 –

Odpowiedz

12

Trzeba naśladować 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

Podobnie jak ciekawość naprawdę, może uzyskać ograniczone dbms_output wyniki z SQL Fiddle, ale trzeba funkcję wyodrębnić buforowane linii i zwraca je w postaci można wybrać. Ten wykorzystuje potokowym tabeli:

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; 
/

a potem, po co masz wydawania dbms_output.put_line połączeń:

select * from table(get_lines); 

Demo. Zobacz też dbms_output documentation, aby dowiedzieć się, co robi procedura get_lines i jak odnoszą się one do twoich połączeń .

Ale tylko dlatego, że można zrobić coś zrobić, nie oznacza, że ​​koniecznie powinien. Jest to niezręczne i nie skaluje się, ale nie próbuje też nauczyć się PL/SQL przez SQL Fiddle.

Chciałbym zarekomendować Bena, aby uzyskać własną bazę danych do zabawy, ale sugeruję, abyś spojrzał na pre-built VM image, który możesz uruchomić w VirtualBox, co oszczędza ci mnóstwo czasu w konfiguracji - nie musisz musicie się martwić o to, jak zainstalować oprogramowanie Oracle lub utworzyć i skonfigurować bazę danych, jest ona po prostu gotowa do użycia i można ją wyrzucić lub łatwo rozpocząć od nowa, jeśli coś pójdzie nie tak.