当前位置: 首页 > 面试题库 >

将UPSERT插入具有动态表名的表中

上官树
2023-03-14
问题内容

将UPSERT插入表格的任何更好的方法,都提供:

  • 数据更新速度约为1行/秒
  • 表名是DYNAMIC,使用传递给它的ObjectID参数生成

以下过程抛出:“ ORA-00942:表或视图不存在”

CREATE OR REPLACE PROCEDURE
PROCEDURE "SPINSERTDATA"
(
  pObjectID IN RAW,
  pDateTime IN TIMESTAMP,
  pValue IN BINARY_DOUBLE,
)
AS
BEGIN
  Declare
    vQueryInsert VARCHAR2(1000);
    vQueryUpdate VARCHAR2(1000);
    vTableName VARCHAR2(30);
  Begin      
      vTableName := FGETTABLENAME(POBJECTID => pObjectID);
      vQueryUpdate := 'UPDATE '      || vTableName || ' SET "VALUE" = :1';
      vQueryInsert := 'INSERT INTO ' || vTableName || ' ("DTTIME", "VALUE") VALUES (:1, :2)';

      EXECUTE IMMEDIATE vQueryInsert USING pDateTime, pValue;
        EXCEPTION
          WHEN DUP_VAL_ON_INDEX THEN 
            EXECUTE IMMEDIATE vQueryUpdate USING pValue;
  End;
END "SPINSERTDATA";
  • 显然,MERGE不起作用,因为TableName不能是动态的?
  • 我是新手,我编码的第三个月,我在STACKOVERFLOW和Googled中搜寻了3天,尝试各种有趣而绝望的解决方案……即使您发现一个非常相关的链接,也将受到真诚的感谢。

问题答案:

MERGE与本机动态SQL完美配合(立即执行):

create table so_test(pk number not null primary key, value varchar2(20));

insert into so_test(pk, value) values(1, 'one');

declare
  l_SQL varchar2(4000);
  l_tablename varchar2(4000) default 'so_test';
begin
  l_SQL := 'merge into ' || l_tablename || ' target' ||
    ' using (select 1 pk, ''eins'' value from dual union all
             select 2 pk, ''zwei'' value from dual) source
      on (target.pk = source.pk)
      when matched then 
        update set target.value = source.value
      when not matched then
        insert values(source.pk, source.value)      
  ';
  dbms_output.put_line(l_sql);
  execute immediate l_SQL;
end;

您能否发布使用MERGE时收到的错误消息?



 类似资料:
  • 问题内容: 我想在具有动态列的表中添加值。我设法用动态列创建了一个表,但无法弄清楚如何插入数据。 问题答案: 您还可以使用数据库元数据获取列名。这样的好处是,您甚至不需要知道列名,而是可以在您的代码中动态检索它们。 一旦有了列名,就可以像平常一样使用它(List.size()当然会给出列数)。 更新: 此代码假定您将正确类型的对象传递给PreparedStatement.setObject(Obj

  • 问题内容: 与先前 的一对一映射问题 类似,我需要一个针对源和目标中多列的解决方案。 仍可与Postgres 9.4.4一起使用,对查询和架构进行了修改,如下所示: 假设我有这两个表和: 还有另一个表,用于存储将数据从迁移到的公式: 如何在动态查询中编译此公式并将其插入目标表? 问题答案: 动态查询多列语句的基本查询-忽略该列: 结果: 这假定了一个 _ 单一的 源和一个 _ 单一的 目标表。否则

  • 问题内容: 我有一个动态查询,执行时会给出带有很多列的结果。我想将来自此动态查询的结果插入到临时表中。我这样做是因为我想对临时表执行一些过滤并获得所需的结果。 在该线程中先创建一个临时表,然后使用插入数据。 由于列的列表太长,我想避免此步骤,而且我不知道字段的数据类型。 错误信息 关键字“ exec”附近的语法不正确。 这该怎么做 ?是否可以通过这种方式完成?如果不是,请指定其他替代方法以将执行动

  • 当数据量比较大的时候,为了提高数据库操作的效率,尤其是查询的效率,其中一种解决方案就是将数据表拆分。 拆分的数据表,结构完全一致,只不过是表的名字,按照某种规律,而成为一组。 动态表名的常用形式 通常情况下动态表名都是通过一个后缀来表示的。比如我们要记录全中国所有的公司以及其雇员,通常的设计是建立 两张数据表, t_company 记录公司,t_employee 记录雇员。由于考虑到 t_empl

  • 问题内容: UPSERT操作会更新表或在表中插入一行,这取决于表是否已经有与数据匹配的行: 由于Oracle没有特定的UPSERT语句,执行此操作的最佳方法是什么? 问题答案: MERGE(“老式方式”)的替代方法:

  • 的计算类似于: 这里的是环境的名称(可以随时间改变),是表名(将固定)。 的值来自文件,该文件使得查询容易受到SQL注入的攻击。 有没有人可以建议我,有什么可能的方法来处理这件事? 注意:我们将来可以迁移到DB2,因此该解决方案应该与Oracle和DB2兼容(如果可能的话,应该与数据库无关)。