oracle数据库如何利用存储过程向表中添加数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库如何利用存储过程向表中添加数据?相关的知识,希望对你有一定的参考价值。

我创建了一个class的表,表中已有一些数据。然后我创建存储过程如下:
create or replace procedure p_class(cno in integer,cname in varchar2(10),java in number,html in number)
is
begin
insert into class(cno,cname,java,html,) values(cno,cname,java,html,oracle);
end;
/
结果提示错误:Warning: Procedure created with compilation errors
我的目的是exec执行插入,想问哪里写错了?正确的应该是什么?
忽略insert那句后面多的oracle

实际上存储过程向表中插入数据和sql执行的区别是不大的,只不过是存储过程是用loop等循环插入,之后顺序执行sql语句,不用命令行执行。

CREATE OR REPLACE PROCEDURE insert_data_4_pressure_3
 is

  --Result1  VARCHAR2(50);
  VAR_num number;
begin
  VAR_num:=1;

 while
   VAR_num< 1000000
   LOOP
      insert into rp_trans_log_day
        (trans_time,
         trans_province,
         trans_type,
         score_range,
         rule_name,
         trans_num)
        select to_date('2013/10/29', 'yyyy-mm-dd'),
               round(dbms_random.value(1, 300)) || '省',
               round(dbms_random.value(1, 800)) || '类型',
               round(dbms_random.value(1, 100)) || '风险分值',
               round(dbms_random.value(1, 300)) || '规则名称',
               '1'
          from dual;
        commit;
    VAR_num:=VAR_num+1;
    end loop;

end insert_data_4_pressure_3;

参考技术A class,java html 这些特殊的字符串不建议用 参考技术B

很高兴为您解答!


    没有存储过程的结束标志;


    将/ 换成end p_class


希望对您有用!

追问

不是这个问题。

参考技术C cname in varchar2(10)
改为
cname in varchar2追问

你是正解,为什么啊?

追答

呵呵,我以前和现在有时也经常犯类似的错误,毕竟写习惯了。
我的理解是这个varchar2仅仅是一个定义,是不需要规定长度的。

不好意思,别忘了采纳啊,我现在只有在网上答题的时候才知道原来我还是dba

本回答被提问者和网友采纳
参考技术D html 列后面的逗号。。。追问

不好意思,那个也请忽略,我多写了。

追答

is 改成 as 试试。 最后的end 后面加上 p_class

追问

还是不行。

追答

在前面的基础上 。class 表名改下吧, 跟保留字重复了。 还不行的就没招了。

追问

问题出在cname的数据类型varchra2(10),但是不知道为什么

EF 6 数据库优先:如何更新存储过程?

【中文标题】EF 6 数据库优先:如何更新存储过程?【英文标题】:EF 6 database first: How to update stored procedures? 【发布时间】:2013-12-29 09:17:10 【问题描述】:

我们使用Entity Framework 6.0.0 并首先使用数据库(like this) 从表和存储过程生成代码。这似乎很好用,只是在更新或刷新模型时不会反映存储过程中的更改。向表中添加列会被反映,但不会向存储过程中添加字段。

有趣的是,如果我转到Model Browser,右键单击存储过程,选择Add Function Import,然后单击按钮Get Column Information,我们可以看到正确的列。这意味着模型知道列,但无法更新生成的代码。

有一种解决方法,即在更新模型之前删除生成的存储过程。只要您没有对存储过程进行任何编辑,这就会起作用。有谁知道避免这种解决方法的方法?

我正在使用 Visual Studio 2013 以及截至 2013 年 12 月初的所有最新更新。

提前致谢!

更新 1: andersr 的回答在一种情况下有所帮助,其中存储过程使用了一个临时表,所以我给了他 +1,但它仍然没有解决更新简单存储过程的主要问题。

更新 2: shimron 在下面的评论链接到关于 EF 3.5 中相同问题的问题。 EF 6.0 似乎仍然如此。阅读它以了解另一种方法,但我现在的结论是,最简单的方法是在更新模型之前删除生成的存储过程。如果您想做一些花哨的事情,请使用部分类。

【问题讨论】:

这个问题“刷新实体框架 3.5 中的存储过程”与您的问题类似。这里:***.com/questions/4995226/… 【参考方案1】:

基于DaveD 的this answer,这些步骤解决了这个问题:

    在您的 .edmx 中,按住 rt 键并选择 模型浏览器。 在模型浏览器中(在 VS 2015 默认配置中,它是解决方案资源管理器中的一个选项卡),展开模型下的 Function Imports。 双击您的存储过程。 点击Returns a Collection Of - Complex旁边的更新按钮(如果不返回标量或实体) 点击okay,然后save您的 .edmx 以反映整个项目中存储过程的字段更改。

【讨论】:

这会更新为返回值生成的复杂类型。知道更新数据库后如何更新模型中存储过程的参数吗? 要回答我自己的问题,使用“从数据库更新模型...”向导刷新整个模型。 如果您没有 .edmx 文件怎么办? 这种方法仅供参考,虽然在 Visual Studio 2017 的所有版本中都有效,但此方法在 Visual Studio 2019 版本 16.0.0 中不起作用【参考方案2】:

您的存储过程是否会从临时表中返回数据? EF 似乎不支持这一点,请参阅EF4 - The selected stored procedure returns no columns 了解更多信息。

但是,如您所见,存储过程将在模型浏览器中可用。我对上述场景进行了快速测试。 存储过程是在我的上下文类中生成的,但返回类型是 int 而不是复杂类型。有关可能的解决方法,请参阅上面的链接。

【讨论】:

+1 因为这有助于使用临时表的存储过程,但它并没有真正解决主要问题(请参阅上面的更新)。还是谢谢!【参考方案3】:

我刚刚遇到这个问题,我的解决方法(真的很讨厌)是在存储过程的顶部创建一个条件永远不会为真的 if 语句,该存储过程选择与带有显式转换的查询相同的输出列表到我要返回的数据类型。这将假定您的类型可以为空,因此要解决您将转换包装在 ISNULL

中的问题

例如,如果您的输出包含以下列:

UserId (int, not null)
RoleId (int, nullable)
FirstName (varchar(255), nullable)
Created (datetime, not null)

你会期望这样创建一个 POCO:

SomeClass 
    public int UserId  get; set; 
    public int? RoleId  get; set; 
    public string FirstName  get; set; 
    public DateTime Created  get; set; 

...但事实并非如此,这就是我们今天在这里的原因。为了解决这个无法按预期工作的问题,我将以下内容放在我的 SP 的顶部(就在“AS”之后):

if(1=0)
begin
    select
        UserId = isnull((cast(0 as int)),0),
        RoleId = cast(0 as int),
        FirstName = cast(0 as varchar),
        DateTime = isnull((cast(0 as datetime)),'')
end

它既可怕又丑陋,但每次都对我有用。希望我们能尽快获得解决此问题的工具更新...今天发生在我身上,SQL Server 2016 w/VS2015 中没有临时表...

希望这对某人有所帮助

【讨论】:

删除后重新添加SP不是更好吗? 是的,世界变得更好了——但不幸的是,删除并重新添加 SP 给了我同样奇怪的结果 我想如果你打开模型浏览器,删除SP,复杂类型和函数导入,关闭并重新打开解决方案并添加SP,它必须工作! 是的,您需要删除所有 3 个工件:sp、复杂类型和函数导入才能正常工作

以上是关于oracle数据库如何利用存储过程向表中添加数据?的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何创建表以及向表里面添加数据

用于向表中添加新行的存储过程,它检查值以验证它们在外部表上的值

mysql写存储过程对单表插入测试数据,出问题

mysql存储过程怎样批量插入数据

mysql存储过程实现数据查询与插入

oracle apex 在使用 INSERT INTO 向表中添加数据时给我一个错误