2013-10-02 42 views
5

其實我是很新的PL/SQLSQL小提琴輸出錯誤

我使用Oracle PL/SQL中的SQL創建如下表小提琴

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

我執行下面的查詢

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

我得到以下輸出

Record Count: 0; Execution Time: 2ms 

它應該打印員工記錄中的值,對吧?在我的sql查詢中有什麼問題,或者一些問題與SQL小提琴無法顯示dbms_output?

+6

沒有,SQL小提琴不會打印出任何東西,因爲它沒有被這樣編碼。如果你下載Oracle(有一個免費版本)並使用不同的客戶端打印出來,那麼你會得到一個輸出。 – Ben

+0

非常感謝。無論如何,我可以在sql小提琴中驗證我的答案嗎? – user2133404

+0

其實你沒有執行查詢,而是PL/SQL代碼塊:)要回答你的問題,你應該運行你的查詢來得到結果:SELECT * FROM Employee WHERE id> 90;檢查這個:http://sqlfiddle.com/#!4/7417b5/7 –

回答

12

你需要效仿dbms_output.put_line :)

模式:

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

真的好奇,你可以得到限制dbms_output來自SQL Fiddle的結果,但是你需要一個函數來提取緩衝行並將它們返回到你可以選擇的表單中。這採用流水線表:

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

然後,無論你已發行dbms_output.put_line來電之後:

select * from table(get_lines); 

Demo。請參閱dbms_output documentation以瞭解其過程所執行的操作以及與您的put_lines調用之間的關係。

但只是因爲你可以做點什麼,並不代表你一定應該。這很尷尬,並沒有擴展,但是也沒有嘗試通過SQL Fiddle真正學習PL/SQL。

我想給Ben建議讓自己的數據庫可以玩,但我建議你看看你可以在VirtualBox中運行的pre-built VM image,它可以節省你很多時間在設置 - 你不不必擔心如何安裝Oracle軟件或創建和配置數據庫,只需準備使用即可,如果出現問題,您可以將其丟棄或輕鬆重新啓動。