小编Jef*_*emp的帖子

从py2exe'd程序连接到Oracle时出错:无法获取Oracle环境句柄

当我使用Python解释器运行它时,我的python程序(Python 2.6)工作正常,它连接到Oracle数据库(10g XE)而没有错误.但是,当我使用py2exe编译它时,可执行版本在调用cx_Oracle.connect()时失败并显示"无法获取Oracle环境句柄".

我没有高兴地试过以下事情:

  • Oracle即时客户端10g和11g
  • Oracle XE客户端
  • 重新安装cx_Oracle-5.0.2-10g.win32-py2.6.msi
  • 设置ORACLE_HOME以及PATH
  • 另一台只有Oracle客户端和exe的计算机
  • 构建exe的各种选项(无压缩和/或使用zip文件)

我的测试用例:

testora.py:

import cx_Oracle
import decimal # needed for py2exe to compile this correctly

def testora():
    """testora

    >>> testora.testora()
    <cx_Oracle.Connection to scott@localhost:1521/orcl>
    X
    """
    orcl = cx_Oracle.connect('scott/tiger@localhost:1521/orcl')
    print orcl
    curs = orcl.cursor()
    result = curs.execute('SELECT * FROM DUAL')
    for (dummy,) in result:
        print dummy

if __name__ == '__main__':
    testora()
Run Code Online (Sandbox Code Playgroud)

build_testora.py:

from distutils.core import setup
import py2exe, sys

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {
        'bundle_files': 2,
        'compressed': True …
Run Code Online (Sandbox Code Playgroud)

python oracle cx-oracle py2exe

6
推荐指数
1
解决办法
4273
查看次数

强制Hibernate在INSERT之前发出DELETE,以避免违反唯一约束?

背景:http://jeffkemponoracle.com/2011/03/11/handling-unique-constraint-violations-by-hibernate

我们的表是:

BOND_PAYMENTS (BOND_PAYMENT_ID, BOND_NUMBER, PAYMENT_ID)
Run Code Online (Sandbox Code Playgroud)

BOND_PAYMENT_ID上有主键约束,(BOND_NUMBER,PAYMENT_ID)上有唯一约束.

该应用程序使用Hibernate,并允许用户查看链接到特定Bond的所有付款; 它允许他们创建新链接,并删除现有链接.一旦他们在页面上做了所有他们想要的更改,他们就会点击"保存",Hibernate会在数据库上运行所需的SQL.显然,Hibernate可以找出需要删除的记录,需要插入哪些记录,并保持其余部分不变.不幸的是,它首先执行INSERT,然后执行DELETE.

如果用户删除了付款的链接,然后改变主意并重新插入指向同一付款的链接,Hibernate很乐意尝试插入然后将其删除.由于这些插入/删除作为单独的SQL语句运行,因此Oracle会在第一个插入时立即验证约束并发出违反ORA-00001唯一约束的情况.

我们只知道两种选择:

  1. 使约束可以推迟
  2. 删除唯一约束

选项2不太合适,因为约束提供了极好的保护,可以防止可能允许保存不一致数据的令人讨厌的应用程序错误.我们选择了1.

ALTER TABLE bond_payments ADD
  CONSTRAINT bond_payment_uk UNIQUE (bond_number, payment_id)
  DEFERRABLE INITIALLY DEFERRED;
Run Code Online (Sandbox Code Playgroud)

缺点是为警告此约束而创建的索引现在是一个非唯一索引,因此查询的效率可能稍低.我们已经确定这对于这个特殊情况并没有那么大的损害.另一个缺点(由Gary建议)可能会遇到特定的Oracle错误 - 虽然我相信由于应用程序的工作方式,我们会免疫(至少大部分).

我们还应该考虑其他选择吗?

oracle hibernate deferrable-constraint ora-00001

6
推荐指数
1
解决办法
2271
查看次数

在oracle中更改表中的多个列

下面的两个脚本(用于改变表)是否会产生差异.. ??

脚本1:

alter table ACNT_MGR_HSTRY add DM_BTNUMBER DATA_TYPE ;
alter table ACNT_MGR_HSTRY add DM_BTID DATA_TYPE ;
alter table ACNT_MGR_HSTRY add DM_USERID DATA_TYPE ;
alter table ACNT_MGR_HSTRY add DM_WSID DATA_TYPE ;
Run Code Online (Sandbox Code Playgroud)

脚本2:

alter table  ACNT_MGR_HSTRY
add
(
DM_BTNUMBER DATA_TYPE,  
DM_BTID DATA_TYPE,
DM_USERID DATA_TYPE,
DM_WSID DATA_TYPE
);
Run Code Online (Sandbox Code Playgroud)

将更新使差异.. ???

update OPERATIONAL_UNIT
 set ( BANK_ID=
 ENTY_CODE_ID=
 TIME_ZONE=
 DM_BTNUMBER=
 DM_BTID=
 DM_USERID=
 DM_WSID=
 );
 -----------
 update OPERATIONAL_UNIT set BANK_ID=;
 update OPERATIONAL_UNIT set ENTY_CODE_ID=;
 update OPERATIONAL_UNIT set TIME_ZONE=;
 update OPERATIONAL_UNIT set DM_BTNUMBER=;
 update OPERATIONAL_UNIT set …
Run Code Online (Sandbox Code Playgroud)

sql oracle ddl alter-table

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

在Oracle PL/SQL中有没有办法导入包及其成员?

给出一个包:

create or replace package foo as
  f1 number := 1;
end;
/
Run Code Online (Sandbox Code Playgroud)

代替:

declare
begin
  dbms_output.put_line('f1 = ' || foo.f1);
end;
/
Run Code Online (Sandbox Code Playgroud)

我想写:

declare
begin
  -- pseudocode not a valid PL/SQL
  import dbms_output.*;
  import foo.*;
  put_line('f1 = ' || f1);
end;
/
Run Code Online (Sandbox Code Playgroud)

但是怎么做呢?

编辑杰夫:(试图保持在PL/SQL中完成工作的精神)

DECLARE
  PRAGMA IMPORT dbms_output AS d;
  PRAGMA IMPORT foo AS f;
BEGIN
  d.put_line('f1 = ' || f.f1);
END;
/
Run Code Online (Sandbox Code Playgroud)

oracle plsql namespaces packages

6
推荐指数
1
解决办法
5256
查看次数

如何防止在选择查询中选择重复行?

我被赋予了从Oracle数据库中选择关键数据的任务,但我注意到我的select正在返回重复的行.我不需要它们用于我的报告但我不希望它们删除它们.有人可以帮助只获取我需要的数据.我尝试了以下代码,但这没有用.

SELECT distinct bbp.SUBCAR "Treadwell",
       bbp.BATCH_ID "Batch ID",
       bcs.SILICON "Si",
       bcs.SULPHUR "S",
       bcs.MANGANESE "Mn",
       bcs.PHOSPHORUS "P",
       to_char(bcs.SAMPLE_TIME, 'dd-MON-yy hh24:MI') "Sample Time",
       to_char(bbp.START_POUR, 'dd-MON-yy hh24:MI') "Start Pour Time",
       to_char(bbp.END_POUR, 'dd-MON-yy hh24:MI') "End pour Time",
       bofcs.temperature "Temperature"
FROM  bof_chem_sample bcs, bof_batch_pour bbp, bof_celox_sample bofcs
WHERE bcs.SAMPLE_CODE= to_char('D1')
AND bbp.BATCH_ID=bcs.BATCH_ID
AND bcs.SAMPLE_TIME>=to_date('01-jan-10')
Run Code Online (Sandbox Code Playgroud)

oracle duplicate-removal

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

有趣的Oracle分析查询挑战

我对Oracle分析功能非常熟悉,但这个让我很难过.如果有一个明显的解决方案,我会踢自己:)

我有一个表,JOURNAL,它在另一个表上记录插入,更新和删除.

它是日记的表是BOND_PAYMENTS,它代表PAYMENTS和BONDS之间的链接; 它存储从特定付款(由PAYMENT_ID标识)分配给特定债券(由BOND_NUMBER标识)的金额(AMOUNT).此外,它还记录了分配给(BOP_DOMAIN)的债券的哪个方面,可能是"BON","PET"或其他一些代码.BOND_PAYMENTS表具有代理键(BOP_ID).

因此,对于每个BOP_ID,我的日志表通常会有一个或多个记录 - 首先是INSert,后面可能是一些UPD,后面可能是一个DELete.

这是JOURNAL表:

CREATE TABLE JOURNAL
( JN_DATE_TIME  DATE         NOT NULL,
  JN_OPERATION  VARCHAR2(3)  NOT NULL,
  BOP_ID        NUMBER(9)    NOT NULL,
  PAYMENT_ID    NUMBER(9)    NOT NULL,
  BOND_NUMBER   VARCHAR2(20) NOT NULL,
  BOP_DOMAIN    VARCHAR2(10) NOT NULL,
  AMOUNT        NUMBER(14,2) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

以下是一些示例数据:

INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',1242043,1003700,'9995/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('03/01/2010','DD/MM/YYYY'),'INS',1242046,1003700,'9998/10','BON',1700);
INSERT INTO JOURNAL VALUES (TO_DATE('04/01/2010','DD/MM/YYYY'),'INS',1242048,1003700,'9999/10','BON',1800);
INSERT INTO JOURNAL VALUES (TO_DATE('05/01/2010','DD/MM/YYYY'),'INS',1242052,1003700,'10003/10','BON',1600);
INSERT INTO JOURNAL VALUES (TO_DATE('08/01/2010','DD/MM/YYYY'),'INS',1242058,1003700,'9998/10','BON',100);
INSERT INTO JOURNAL VALUES (TO_DATE('09/01/2010','DD/MM/YYYY'),'UPD',1242058,1003700,'9998/10','PET',100);
INSERT INTO JOURNAL VALUES (TO_DATE('01/01/2010','DD/MM/YYYY'),'INS',2242043,1003701,'8995/10','BON',1800);
INSERT INTO JOURNAL …
Run Code Online (Sandbox Code Playgroud)

oracle analytic-functions oracle11gr2

6
推荐指数
1
解决办法
848
查看次数

合并日期范围

Oracle SQL新手在这里和第一次海报.

我认为这很简单,直到我意识到我无法弄清楚如何拆分返回作业.

这是我的作业表:ASGN

ID  ST_DT       END_DT      POS    LOCN  STATUS  WAGE_CD
--  ----------  ----------  -----  ----  ------  -------
A   12-31-2006  08-16-2009  CLERK  LAX   3       A
A   08-17-2009  10-04-2009  CLERK  LAX   0       Z
A   10-05-2009  06-30-2010  OPR    NYC   3       A
A   07-01-2010  12-31-2010  OPR    NYC   3       B
A   01-01-2011  06-30-2012  OPR    NYC   3       C
A   07-01-2012  04-09-2013  OPR    NYC   3       D
A   04-10-2013  06-30-2013  CLERK  LAX   3       A
A   07-01-2013  08-10-2014  CLERK  LAX   3       B
A   07-01-2013  08-10-2014  CLERK  LAX   3 …
Run Code Online (Sandbox Code Playgroud)

sql oracle

6
推荐指数
1
解决办法
428
查看次数

如何从Oracle Job Scheduler中停止或删除作业

听起来很简单吧?我有一份正在运行的工作,我想停下来(它已经运行了很长时间,显然存在问题).好吧,当我试图停止这项工作时,我得到了这样的信息:

ORA-27366:作业"string.string"未运行.原因:尝试停止未运行的作业.

但是,当我试图完全放弃工作时,因为我真的不想让它再运行,我得到这样的信息:

ORA-27478:作业"string.string"正在运行.原因:尝试删除当前正在运行的作业.

真的,甲骨文?下定决心!谁看过这个吗?如何在不重新启动服务器的情况下停止此流氓作业?!?!

oracle scheduling

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

相同的SQL但不同的解释计划

我在具有相同索引集和表大小的2个不同环境中运行相同的SQL(下面).但是他们给了我2个不同的解释计划(附后)

  1. 使用合并加入笛卡尔 - 非常慢
  2. 使用PX协调器/ PX发送/ PX接收 - 非常快

查询:

SELECT *
FROM SIEBEL.S_PARTY PRTY, SIEBEL.S_CONTACT CONT, HPQ_IF_ENTERPRISE_DIRECTORY ED,SIEBEL.S_BU BU 
WHERE PRTY.ROW_ID = CONT.PAR_ROW_ID 
AND BU.ROW_ID(+)=CONT.BU_ID 
AND CONT.EMP_NUM IS NOT NULL 
AND ED.HPSTATUS NOT IN ('Terminated', 'Retired', 'Deceased') 
AND ED.EMPLOYEENUMBER = UPPER (LPAD (CONT.EMP_NUM, 8, '0')) 
AND (SUBSTR(ED.MODIFYTIMESTAMP,1,14) >= '19800101' OR ED.MODIFYTIMESTAMP IS NULL)
Run Code Online (Sandbox Code Playgroud)

知道造成这种差异的可能原因是什么?第二个解释计划(PX的东西)是什么意思?

请注意,我不是在寻找更改SQL查询(在生产中冻结).

非常感谢.

sql oracle performance setting

5
推荐指数
1
解决办法
5884
查看次数

突出显示两个字符串之间的差异

如果我有两个很长的字符串VARCHAR2,是否可以通过简单的方法或算法将其复制或移植到PL / SQL进行比较,然后插入标记(即,在网页中呈现时将突出显示差异)。

例如:

BEGIN
  DBMS_OUTPUT.put_line(
    markup_differences
         (in_old     => 'Hello world, this is your captain speaking.'
         ,in_new     => 'Hello WORLD, this is not your captain.'
         ,in_preins  => '<ins>'
         ,in_postins => '</ins>'
         ,in_predel  => '<del>'
         ,in_postdel => '</del>'
         ));
END;
Run Code Online (Sandbox Code Playgroud)

预期产量:

Hello <del>world</del><ins>WORLD</ins>, this is <ins>not</ins> your captain
<del>speaking</del>.
Run Code Online (Sandbox Code Playgroud)

注意,这表明“ world”已更改为“ WORLD”,插入了“ not”,并且已删除了“ speaking”。

背景:我的目的是比较两个最相似的HTML片段,并用高亮标记它们以在浏览器中显示。性能将不是优先事项。这是用于一次性应用程序的,所以我不是一个完美的解决方案。即使某事让我参与其中,总会有总比没有好-而且我还没有向客户承诺任何事情:)

另外,我可以轻松地将Javascript的简单解决方案轻松集成到Apex应用程序中。

oracle plsql string-comparison oracle11gr2

5
推荐指数
1
解决办法
2598
查看次数