小编APC*_*APC的帖子

使用特定于数据库的数据类型进行Rails迁移

我目前正在运行Rails迁移,我正在添加一个特定于Postgres,tsvector的数据类型.它以Postgres期望的内置文本搜索功能的形式保存搜索信息.

这是我迁移的一行:

t.column "search_vectors", :tsvector
Run Code Online (Sandbox Code Playgroud)

一切似乎都运行正常,搜索也适用.但是,当我打开schema.rb时,这就是我得到的:

Could not dump table "users" because of following StandardError
Unknown type 'tsvector' for column 'search_vectors'
Run Code Online (Sandbox Code Playgroud)

这使我无法在用户表上运行单元测试,并且鉴于schema.rb应该是我的数据库的权威定义,这也让我觉得非常危险.

我注意到有许多Rails插件似乎使用了像我期望的那样存储tsvector的相同方法,例如tsearchable.我真的只是坚持没有测试,没有我的数据库的权威定义?

migration postgresql ruby-on-rails tsvector custom-data-type

13
推荐指数
1
解决办法
2630
查看次数

SELECT SUM在没有记录时返回一行

我发现查询存在一些问题,该查询返回表中满足特定条件的所有记录的字段总和.我希望在没有记录的情况下收到"没有找到记录",但我收到的结果是空的.

SQL> SELECT * FROM DUAL WHERE 1=2;

no rows selected
SQL> SELECT SUM(dummy) FROM DUAL WHERE 1=2;

SUM(DUMMY)
----------


SQL>
Run Code Online (Sandbox Code Playgroud)

在这种情况下有没有办法不收到任何记录?

sql oracle sum

13
推荐指数
2
解决办法
2万
查看次数

pl/sql对象类型"ORA-06530:未初始化复合引用"错误

我有一个类型如下:

CREATE OR REPLACE TYPE tbusiness_inter_item_bag AS OBJECT (
   item_id              NUMBER,
   system_event_cd      VARCHAR2 (20),
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY tbusiness_inter_item_bag
AS
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
   AS
   BEGIN
      RETURN;
   END;
END;
Run Code Online (Sandbox Code Playgroud)

当我执行以下脚本时,我得到了一个"未初始化复合参考"错误,这是非常合适的.

DECLARE
   item   tbusiness_inter_item_bag;
BEGIN
   item.system_event_cd := 'ABC';
END;
Run Code Online (Sandbox Code Playgroud)

这也引发了同样的错误:

item.item_id := 3;
Run Code Online (Sandbox Code Playgroud)

但如果我将我的对象类型更改为:

CREATE OR REPLACE TYPE tbusiness_inter_item_bag AS OBJECT (
   item_id              NUMBER(1),
   system_event_cd      VARCHAR2 (20),
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
);
Run Code Online (Sandbox Code Playgroud)

然后最后一个语句不再引发错误(我的"项目"仍然未初始化):

item.item_id := 3; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql user-defined-types

13
推荐指数
1
解决办法
3万
查看次数

如何捕获数据库错误并将其转换为业务层的有意义信息?

通常我必须在数据库中插入一些数据并且无法插入,因为该表具有阻止我这样做的约束.使用我正在开发的应用程序,一些业务规则(例如"没有两个具有相同id类型和编号的人"或"XXXX产品已经注册")是使用UNIQUE或复合密钥和其他机制强制执行的.虽然我知道DBMS会抛出错误消息(如ORA-6346或),但我不知道如何在.net 4.0中捕获这些错误并将它们转换为对业务层有意义的错误.

作为一个例子:我已经看到一个插入机制,询问数据库是否已存在该寄存器,然后如果不是这样,则继续插入数据.我想这样做只使用一个查询并捕获数据库约束违规错误,因为第一种方式在我看来效率非常低(DB可以提醒你有关重复的错误).

我怎么能实现这样的东西?

注意:我认为可以从数据库中捕获异常并使用其ORA-xxxx代码来试图弄清楚发生了什么.如果错误消息显示哪个约束(名称...)已被破坏,我不记得精确,但业务层代码可以包含具有约束名称的常量,并从中了解发生了什么.

.net architecture oracle software-design

13
推荐指数
1
解决办法
836
查看次数

执行pl/sql查询时出现溢出错误

当我使用我的C#代码运行pl/sql查询[通过存储过程]时,我收到一个错误:我该如何解决?请提供建议.注意:我在代码中为providerSpecificTypes传递false.

 Error Message:
 System.Data.OracleClient.OracleException: OCI-22053: overflow error   
 at System.Data.Common.DbDataAdapter.FillErrorHandler(Exception e, DataTable dataTable, Object[] dataValues)    
 at System.Data.Common.DbDataAdapter.FillLoadDataRowChunk(SchemaMapping mapping, Int32 startRecord, Int32 maxRecords)    
 at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)    
 at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
 at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)    
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command,
Run Code Online (Sandbox Code Playgroud)

这是代码:

DataSet ds = new DataSet(); 
        try 
        { 
            this.OpenDBConnection(); …
Run Code Online (Sandbox Code Playgroud)

c# oracle ado.net plsql

13
推荐指数
1
解决办法
1万
查看次数

Oracle最后以NULL递减降序

我的目标是,以"DESCENDING"顺序打印查询结果.但问题是,具有NULL值的行位于列表的顶部..如果order by降序,如何将空行放在底部?

select mysubcat.subcat
       , mysubcat.subcatid as subcat_id
       , (select SUM(myad.PAGEVIEW) 
           from myad 
            where MYAD.CREATEDDATE between  '01-JUL-13 02.00.49.000000000 PM' and '13-JUL-13 02.00.49.000000000 PM'
            AND MYAD.status = 1 
            and  MYAD.mobileapp IS NULL
            and myad.subcatid = mysubcat.subcatid )as web_views 
from mysubcat 
order by web_views desc;
Run Code Online (Sandbox Code Playgroud)

样本结果是这样的

                             SUBCAT_ID    WEB_VIEWS
Swimming Lessons                56        (null)    
Medical Services                17        (null)
Mobile Phones & Tablets         39        6519
Home Furnishing & Renovation   109        4519
Run Code Online (Sandbox Code Playgroud)

顺序是降序,我只是想在打印结果的底部放置带有空值的行,那怎么样?

sql oracle

13
推荐指数
2
解决办法
2万
查看次数

如何使dbms_metadata.get_ddl更漂亮/有用

我正在创建一个包来生成我的模式中的对象的DDL(您解析对象名称,并返回一个clobDDL),所以我可以生成文件,并将它们直接放入SVN.

我正在使用dbms_metadata.get_ddl它,它适用于除表/物化视图之外的所有对象.

如果我创建一个表:

create table stackoverflow
     ( col_1 varchar2(64)
     , col_2 number
     , col_3 date);

create index idx_test on stackoverflow(col_1);

alter table stackoverflow add constraint ui_test unique (col_2) using index;
Run Code Online (Sandbox Code Playgroud)

并生成DDL:

begin
   dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
                                             , name => 'STACKOVERFLOW')
                        );
end;
Run Code Online (Sandbox Code Playgroud)

它给了我们:

CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW" 
 (  "COL_1" VARCHAR2(64), 
  "COL_2" NUMBER, 
  "COL_3" DATE, 
   CONSTRAINT "UI_TEST" UNIQUE ("COL_2")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE …
Run Code Online (Sandbox Code Playgroud)

oracle ddl plsqldeveloper dbms-metadata

13
推荐指数
2
解决办法
5635
查看次数

如何更改Oracle XE实例的SID

我需要更改Oracle XE数据库的SID(而不是服务名称)以匹配生产数据库.

当我尝试在线搜索时,大多数页面都是通过tnsnames.ora描述更改或添加服务名称; 那不是我需要做的.

oracle sid oracle-xe service-name

12
推荐指数
1
解决办法
3万
查看次数

App Engine和MySQL

我只是想问一下我们是否可以从Google App Engine访问外部MySQL服务器...

mysql architecture google-app-engine external

12
推荐指数
1
解决办法
7141
查看次数

ORACLE SQL日期范围交叉点

我有一个表T1,它包含一个NAME值(不是唯一的),一个日期范围(D1和D2是日期)当NAME相同时,我们建立一个日期范围的联合(例如B).

但作为结果(X),我们需要交叉所有日期范围

编辑:表T1

NAME | D1       | D2
A    | 20100101 | 20101211
B    | 20100120 | 20100415
B    | 20100510 | 20101230
C    | 20100313 | 20100610
Run Code Online (Sandbox Code Playgroud)

结果:

X    | 20100313 | 20100415
X    | 20100510 | 20100610
Run Code Online (Sandbox Code Playgroud)

在视觉上,这将给出以下内容:

NAME        : date range
A           : [-----------------------]-----
B           : --[----]----------------------
B           : ----------[---------------]---
C           : -----[--------]---------------
Run Code Online (Sandbox Code Playgroud)

结果:

X           : -----[-]----------------------
X           : ----------[---]---------------
Run Code Online (Sandbox Code Playgroud)

知道如何使用SQL/PL SQL获得它吗?

sql oracle plsql date-range date-arithmetic

12
推荐指数
1
解决办法
8763
查看次数