当我使用Python解释器运行它时,我的python程序(Python 2.6)工作正常,它连接到Oracle数据库(10g XE)而没有错误.但是,当我使用py2exe编译它时,可执行版本在调用cx_Oracle.connect()时失败并显示"无法获取Oracle环境句柄".
我没有高兴地试过以下事情:
ORACLE_HOME以及PATH我的测试用例:
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) 背景: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唯一约束的情况.
我们只知道两种选择:
选项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错误 - 虽然我相信由于应用程序的工作方式,我们会免疫(至少大部分).
我们还应该考虑其他选择吗?
下面的两个脚本(用于改变表)是否会产生差异.. ??
脚本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) 给出一个包:
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数据库中选择关键数据的任务,但我注意到我的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分析功能非常熟悉,但这个让我很难过.如果有一个明显的解决方案,我会踢自己:)
我有一个表,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 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) 听起来很简单吧?我有一份正在运行的工作,我想停下来(它已经运行了很长时间,显然存在问题).好吧,当我试图停止这项工作时,我得到了这样的信息:
ORA-27366:作业"string.string"未运行.原因:尝试停止未运行的作业.
但是,当我试图完全放弃工作时,因为我真的不想让它再运行,我得到这样的信息:
ORA-27478:作业"string.string"正在运行.原因:尝试删除当前正在运行的作业.
真的,甲骨文?下定决心!谁看过这个吗?如何在不重新启动服务器的情况下停止此流氓作业?!?!
我在具有相同索引集和表大小的2个不同环境中运行相同的SQL(下面).但是他们给了我2个不同的解释计划(附后)
查询:
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查询(在生产中冻结).
非常感谢.
如果我有两个很长的字符串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 ×10
sql ×3
oracle11gr2 ×2
plsql ×2
alter-table ×1
cx-oracle ×1
ddl ×1
hibernate ×1
namespaces ×1
ora-00001 ×1
packages ×1
performance ×1
py2exe ×1
python ×1
scheduling ×1
setting ×1