Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写在sql中显示表内容的过程_Sql_Oracle_Plsql - Fatal编程技术网

如何编写在sql中显示表内容的过程

如何编写在sql中显示表内容的过程,sql,oracle,plsql,Sql,Oracle,Plsql,我创建了一个过程作为 create or replace procedure availability(num in number) as begin delete from vehicle_count; insert into vehicle_count from select engine_no,count(engine_no) from vehicle where engine_no = num group by engine_no; end

我创建了一个过程作为

create or replace procedure availability(num in number) as
begin
    delete from vehicle_count;

    insert into vehicle_count from select engine_no,count(engine_no)
    from   vehicle
    where  engine_no = num
    group by engine_no;
end;
/
该过程已成功创建,但现在我必须编写一个单独的查询来查看vehicle_count as的内容

select * from vehicle_count;
我尝试在插入后将select语句插入到过程中,但它显示了一个错误,声明“select语句中应包含into子句”

如何创建过程来选择所需的内容并在单个execute语句中显示它

表模式

车辆(车辆号、发动机号、违章计数、驾照状态、车主id); 车辆计数(发动机编号、发动机计数)

检查此项(MS SQL SERVER)-


如果要在PL/SQL块中使用SELECT into,则应使用SELECT into或循环(如果要打印更多行)。 您可以使用以下内容:

BEGIN
  SELECT engine_no, engine_count
    INTO v_engine, v_count
    FROM vehicle_count
   WHERE engine_no = num;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    v_engine := NULL;
    v_count := NULL;
END;

v_引擎和v_计数是两个变量。您可以在过程中声明它们,它们将包含要打印的值。

您说过您编写的过程(实际上,您发布在此处)编译成功。嗯,很抱歉通知你——那不是真的。这不是有效的语法:

insert into vehicle_count from select engine_no,count(engine_no)
                          ----
                          from? Here?
考虑发布真实信息


关于您的问题(如果我们假设该INSERT实际上在表中插入了某些内容):

  • 开始时,删除表中的所有内容
  • 由于SELECT统计共享相同引擎号(等于参数NUM值)的行数,因此INSERT不插入任何行(如果表中没有此类NUM值)或最多插入1行(因为聚合)
  • 因此,如果您想显示表中的内容,只需进行一次选择。。。INTO语句,其结果显示在一个简单的DBMS_OUTPUT.PUT_行中,如果您以交互方式(在SQL*Plus、SQL Developer、TOAD和smilar工具中)执行此操作,则该行就可以了。关于表描述,我认为ENGINE_NO应该是主键(即,表中最多只能存在一行带有该ENGINE_NO值)


有许多替代方案(在此之前发布答案/评论的人提到了其中一些),最终结果取决于您希望在何处显示这些信息。

您使用的是哪种RDBMS?您已经标记了
mysql
sql server
@McNets:
create或replace
既不是T-sql也不是mysql,可能OracleIt不是mysql,insert from语句也错了。数字数据类型为oracle。从何处调用?(Java?另一个过程?)您的数据库版本是什么?如果是Oracle 12.1或更高版本,您可以使用,但不是每个客户端都会自动处理此问题。否则您可以返回一个ref游标吗?为什么要实现这个?它说的是编译错误创建的过程。它显示4/1 PL/SQL:SQL语句被忽略5/8 PL/SQL:ORA-00926:missing VALUES关键字以上语法适用于MS SQL Server。@Sreenumurogesan那么为什么要标记SQL Server?非常感谢!!
insert into vehicle_count from select engine_no,count(engine_no)
                          ----
                          from? Here?
create or replace procedure availability (num in number) as
  l_engine_no     vehicle_count.engine_no%type;
  l_engine_count  vehicle_count.engine_count%type;
begin
  delete from vehicle_count;

  insert into vehicle_count (engine_no, engine_count)
    select engine_no, count(engine_no)
      from vehicle
      where engine_no = num
      group by engine_no;

  -- This query shouldn't return TOO-MANY-ROWS if ENGINE_NO is a primary key.
  -- However, it might return NO-DATA-FOUND if there's no such NUM there, so you should handle it
  select engine_no, engine_count
    into l_engine_no, l_engine_count
    from vehicle_count
    where engine_no = num;  

  dbms_output.put_line(l_engine_no ||': '|| l_engine_count);

exception
  when no_data_found then 
    dbms_output.put_line('Nothing found for ENGINE_NO = ' || num);
end;
/