【问题标题】:SQL Fiddle Output ErrorSQL小提琴输出错误
【发布时间】:2013-10-09 01:53:15
【问题描述】:

其实我对 PL/SQL 还是很陌生

我在 SQL Fiddle 中使用 oracle pl/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 fiddle 无法显示 dbms_output 有问题?

【问题讨论】:

  • 不,SQL Fiddle 不会打印出任何东西,因为它没有被这样编码。如果您下载 Oracle(有免费版本)并使用不同的客户端将其打印出来,那么您将获得输出。
  • 非常感谢。无论如何我可以在 sql fiddle 中验证我的答案吗?
  • 实际上您没有执行查询,而是执行 PL/SQL 代码块 :) 要回答您的问题,您只需运行查询以获取结果: SELECT * FROM Employee WHERE id > 90;检查这个:sqlfiddle.com/#!4/7417b5/7
  • 我正在尝试学习 PL/SQL 中的编码 :)
  • 那么,按照Ben的建议,你应该下载一个Oracle数据库服务器,它是免费的,你可以在这里下载(我推荐11g R2,但你最好从最新版本开始, 即 12c): oracle.com/technetwork/database/enterprise-edition/downloads/…

标签: oracle plsql sqlfiddle


【解决方案1】:

你需要模仿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

【讨论】:

    【解决方案2】:

    出于好奇,您可以从 SQL Fiddle 获得有限的dbms_output 结果,但是您需要一个函数来提取缓冲的行并以您可以选择的形式返回它们。这使用流水线表:

    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 以了解其 get_lines 过程的作用以及它与您的 put_lines 调用的关系。

    但仅仅因为你可以做某事,并不意味着你一定应该。这很尴尬并且无法扩展,但尝试通过 SQL Fiddle 学习 PL/SQL 也不是真的。

    我赞同 Ben 的建议,即使用您自己的数据库,但我建议您查看可以在 VirtualBox 中运行的 pre-built VM image,这可以为您节省大量设置时间 - 您不需要无需担心如何安装 Oracle 软件或创建和配置数据库,它可以立即使用,如果出现问题,您可以将其丢弃或轻松重新开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多