环境: java,was,python2.6,Red Hat linux,oracle,cx_Oracle for python
问题是这样,需要处理. 简而言之,将数据取出,使用python传递外部参数进行处理,然后再写回. 如果直接使用Java,则需要大个圈,这比较麻烦. 如果使用python,则非常简单. 因此,有以下故事. 希望与我有同样问题的学生能为您提供帮助. 在某些方面,java和python的功能开发非常顺利,因此调用python链接为java
可能为需要使用的功能编写了两个脚本,一个用于连接,一个用于实现功能,这对于以后的描述很方便
dbconn.py用于连接
#!/usr/bin/python#coding: UTF-8
importcx_Oracledefora_conn():
user_name= 'user'passwd= 'pass'host= 'localhost/orcl'conn=cx_Oracle()return conn
case.py用于处理数据
'''接收传入参数
使用传入参数作为where条件到oracle中进行查找
对数据进行处理
写回到oracle'''
#!/usr/bin/python#coding: UTF-8
importosimportsys#尝试获取环境变量my_home
my_home = os.getenv('my_home')if notmy_home:
my_home= '/home/user_name'
#cx_Oracle脚本是放在pypk目录里的,因此需要增加这个地方
sys.path.append('%s/pypk' %my_home)importdbconn#接收参数,为了防止后面因为手误将此变量变更这里用global声明下全局,可有可无
globalout_into
out_into= sys.argv[1]#获取数据
defget_data():print 'get data'conn=dbconn.ora_conn()
conn_cur=conn.cursor()
sql= 'select col1,col2 from tablename where col1 = %r' %out_into
data_values=conn_cur.execute(sql)
result=list(data_values)
conn_cur.close()
conn.close()returnresult#处理,为了方便,假设就是在col1前面加a和col2前面加b,然后拼在一起用;分隔
defmanage_data(values):print 'manage data'col1= 'a' +str(values[0])
col2= 'b' + str(values[1])
col_return= col1 + ';' +col2returncol_return#写入d
definto_data(into_values):print 'insert into data'conn=dbconn.ora_conn()
conn_cur=conn.cursor()
sql= 'insert into result_table(col) values(%r)' %into_values
conn_cur.execute(sql)
conn.commit()
conn_cur.close()
conn.close()defmain():print 'run start'datas=get_data()for line indatas:
ok_values=manage_data(line)
into_data(ok_values)if __name__ == '__main__':
main()
exit()
由于我不知道Java调用的效果,因此我首先编写了一个简单的python脚本,并通过Java调用对其进行了测试
test.py这仅用于测试功能,因此只有一行代码
print 'hello'
测试成功. 因为这里没有环境,所以我不会截屏. 添加了两行以测试通过参数
test.py
print 'hello'a= sys.argv[1]print a
同样成功,我完全放心地去了官方脚本进行测试java 调用失败重试2次,并正常打印了脚本的内容
运行开始
获取数据
管理数据
插入数据
转到,发现目标表result_table没有数据. 我擦了一下,该死,没有报告错误,也没有处理它,完全毫无头绪,请尝试添加尝试以查看是否有帮助. 所以case.py的主要功能变成这样
defmain():print 'run start'
try:
datas=get_data()for line indatas:
ok_values=manage_data(line)
into_data(ok_values)exceptException, e:print e
这一次证明cx_Oracle连接失败,缺少libclntsh.so.11.1. 在这里,我们强调了所有调用win的cx_Oracle,需要复制什么dll,在linux中这是没有用的,甚至Win也不是将一堆dll复制到脚本的当前目录中,如上所述. 只是治愈症状的方法.
正确的方法是添加三个环境变量
export ORACLE_HOME=oracle_install_path #第一个当然是ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME/bin #第二个是bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib #第三个是lib
我不想离开维修站. 我建议将这三个变量添加到〜/ .bashrc中,但这不能解决基本问题,如稍后将解释的,请继续往下看
添加环境变量后,再次执行. 错误连接到Oracle,Nima狗添加了该错误,因此在本地linux服务器上执行了该错误,并生成了结果. . . . . . 正常执行是完全有问题的. 这次真是地狱. 楠(Nan)说的很好,只有一个道理java 调用失败重试2次,所以我不相信. 我想看看有什么问题. 根据过去的经验,如果添加环境变量失败,则该用户和添加该环境变量的用户可能会不一致. 在case.py
中添加一个段落
importgetpass
now_user= getpass.getuser() #用来获取当前操作用户
print now_user
结果是root,是的,它是root,我也是SB. .bashrc是不是全局变量,还是所有用户都可以使用的环境变量?忘记了,死马是活马医,让我们看看环境变量中有什么东西,在case.py中添加另一行
os.system('env') #调用linux的外部命令,查看全部环境变量
然后出乎意料地出现了,根本没有将三个环境变量添加到打印的环境变量中,并且其中大多数不是Linux中的环境变量. 其中许多被was使用. 它有自己的环境吗?变量,我问同事. 果然,我确实有自己的环境变量配置. 既然已经发现问题,解决方案是将这三个添加到自己的环境变量中. 因此,. . . . . was中添加了三个环境变量ORACLE_HOME,PATH,LD_LIBRARY_PATH.
在重新测试下,尼玛刚刚加入的内容不在其中,这很尴尬,该怎么办. . . 怎么做. . . 最后,当分针从12缠绕到11时,有一种方法可以将环境变量添加为外部命令. 只需继续在case.py
中添加三行
os.system(export ORACLE_HOME=oracle_install_path)
os.system(export PATH=$PATH:$ORACLE_HOME/bin)
os.system(export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib)
这一次,我几乎要成为福尔摩斯了,我觉得我已经超过了一些楠,还有木头,但是事实仍然给了我打击,失败了,这三个印刷环境变量仍然不存在,原因是这样的: 添加的环境变量将不会直接有效,需要注销才能生效,它只是折叠起来,然后分针从12变为11. 突然受到启发,如果您可以使用Python自己的添加环境变量的方法,可以绕过取消注销的步骤,只需完成注销,因此将case.py放入
os.system(export ORACLE_HOME=oracle_install_path)
os.system(export PATH=$PATH:$ORACLE_HOME/bin)
os.system(export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib)
替换以下内容
oracle_home_env = [['ORACLE_HOME','oracle_install_path'],['PATH','$PATH:$ORACLE_HOME/bin'],['LD_LIBRARY_PATH','$LD_LIBRARY_PATH:$ORACLE_HOME/lib']]for env_line inoracle_home_env:
os.environ[env_line[0]]= env_line[1]
好的,我承认,这种方法不是我想出的. 可以想到这种添加环境变量的方法的人真的是上帝
继续我们的故事,然后出现奇迹,这三个环境变量最终出现在打印结果中,但是仍然报告连接的错误,但这很容易处理,因为环境变量指向,然后只需使用linux方法来调用脚本. 只需使其简单并添加一个新脚本即可调用case.py,只需几行
call_script.py用于使用外部命令调用case.py
#!/usr/bin/python#coding: UTF-8
importos
out_into= sys.argv[1]
my_home= os.getenv('my_home')if notmy_home:
my_home= '/home/user_name'os.system('python %s/case.py %s' %(my_home,out_into))
故事就在这里,但是像大多数剧本一样,一定总有个鸡蛋哈哈
您认为这是结局吗?当然没有,您见过my_home了,这也是一个环境变量!这里没有错误的原因是因为在下面添加了if. 如果未获得,默认为/ home / user_name,但是路径更改了吗?通过此升级,我觉得这些棍棒可以升级为金箍棒. 这是一件小事吗?好吧,我们不要说话,我要吃点东西来庆祝.
这是春节,已经一年了,直到今天,我仍然可以看到这篇文章也是命运. 在这里,我祝大家在新的一年里有很多钱,更少的矿坑,身体健康,身体健康. 可以实现标志!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-175741-1.html