使用Oracle的类型ORM:如何删除DDL命令中的双引号?

t98cgbkg  于 2023-03-01  发布在  Oracle
关注(0)|答案(1)|浏览(329)

TypeORM创建名称中使用双引号的表和列。示例:创建表"users"("id"编号、"name" varchar2(30)"等
问题是,如果我试图查询表(使用任何Oracle SQL客户端),我必须使用双引号。从用户中选择 *。我必须使用:从"用户"中选择 *。
第一次尝试:我使用命令queryRunner.query("create table users ...")手动创建了我的迁移。它工作正常,但是当我尝试使用用户存储库时,TypeORM说找不到表,因为它尝试使用"user"作为表名插入。插入到"用户"("id","name",....
对于Oracle:select * from "user"与select * from user不同。如果表是用双引号创建的,则只能用双引号查找。
我使用的是typeorm版本"^0.3.12"。
我知道在旧版本的typeorm中有一个名为quoteIdentifiers = false的参数,可以解决这个问题,但是在新版本中不起作用。
有什么办法吗?
先谢谢你。

vyswwuz2

vyswwuz21#

如果您无法找到在TypeORM中执行此操作的方法,并且需要最后的解决方法,则可以创建INSTEAD OF CREATE触发器来拦截create DDL并删除双引号。但是,您确实希望在客户端解决此问题。如果您确实需要尝试此解决方法,则可以这样做:

CREATE OR REPLACE TRIGGER t INSTEAD OF CREATE ON SCHEMA
  DECLARE
    var_sql_count pls_integer;
    var_original_sql varchar2(32767);
    var_new_sql varchar2(32767);
    tab_sql ora_name_list_t := ora_name_list_t();
  BEGIN
    var_sql_count := original_sql_txt(tab_sql);
    
    IF var_sql_count > 0
    THEN
      BEGIN
        /*
        ** Assemble the SQL pieces together
        */
        FOR i IN 1..var_sql_count
        LOOP
          var_original_sql := var_original_sql||tab_sql(i);
        END LOOP;
      EXCEPTION
        WHEN OTHERS THEN
          NULL;
      END;
    END IF;
    
    /*
    ** Make changes to the DDL
    */
    IF ora_dict_obj_type = 'TABLE'
    THEN
      var_new_sql := REPLACE(var_original_sql,'"');
    ELSE
      var_new_sql := var_old_sql;
    END IF;
    
    /*
    ** Execute new DDL in place of old
    */
    EXECUTE IMMEDIATE var_new_sql;
  END;

试验:

create table test2 ("col1" integer);

SELECT column_name
  FROM user_tab_columns
 WHERE table_name = 'TEST2'

结果:COL1(大写)

相关问题