我有一个这样的脚本:
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET TERMOUT OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET WRAP OFF
SET LINESIZE 32000
SET LONG 32000
SET LONGCHUNKSIZE 32000
SET SERVEROUT ON
SPOOL C:\Export.txt
SELECT XMLELEMENT("element1",xmlelement("element2",xmlattributes(.....)))
FROM --TABLENAME--
WHERE --CONDITIONS--
Run Code Online (Sandbox Code Playgroud)
输出应该是一个包含内部复杂xml的行列表的文件,但是当生成的XML长度超过2000时,SQLPlus将修剪为2000并转到下一行.
有一种方法可以强制SQLPlus在同一行中写入所有数据吗?
SELECT
dealing_record.*
,shares.*
,transaction_type.*
FROM
shares
INNER JOIN shares ON shares.share_ID = dealing_record.share_id
INNER JOIN transaction_type ON transaction_type.transaction_type_id = dealing_record.transaction_type_id;
Run Code Online (Sandbox Code Playgroud)
上面的SQL代码产生了所需的输出,但有几个重复的列.此外,列标题显示不完整.当我改变了
linesize 100
Run Code Online (Sandbox Code Playgroud)
标题显示但数据显示重叠
我已经检查了类似的问题,但我似乎没有得到如何解决这个问题.
我安装了32位和64位Oracle 11g驱动程序.我搜索我的电脑,寻找名为"tnsnames.ora"的文件,并在以下位置找到3个:
1. C:\Oracle\product\11203_32bit\CLIENT_1\NETWORK\ADMIN
2. C:\Oracle\product\11203_64bit\CLIENT_1\NETWORK\ADMIN
3. C:\Windows\TNS
Run Code Online (Sandbox Code Playgroud)
tnsnames.ora文件的第三个位置的存在让我感到惊讶.
我的PC上安装了以下Oracle客户端:
"C:\Program Files (x86)\Quest Software\Toad for Oracle 11.6\Toad.exe"
"C:\Program Files\Devart\dbForge Studio Express for Oracle\dbforgeoracle.exe"
Run Code Online (Sandbox Code Playgroud)
基于每个程序的位置(Program Files(x86)与c:\ Program Files),这向我建议,32位程序Toad应该使用32位驱动程序,而dbForge应该使用64位驱动程序.
dbForge似乎使用位置#2或#3中的tnsnames.ora文件.我知道这一点,系统地重命名除了一个tns文件之外的所有文件,然后在尝试使用app创建新连接时检查从文件中读取的连接名是否可用.
但是,TOAD似乎只识别位置#3中的tnsnames.ora文件,它根本无法识别位置2中的tnsnames.ora文件!(因为它是一个32位程序,我没想到它会识别位置2中的tns文件,就是这种情况).为了清楚起见,TOAD测试总结了TOAD测试,TOAD只识别位置3中的tns文件.
其他同事在他们的机器上没有位置3的tns文件.我不知道为什么我这样做.当我运行Toad时,它会显示以下2个Home,其中32位Home是活动的.
OraClient11g_home1 (11.2.0.3)
ORACLE_HOME:C:\app\C39293\product\11.2.0\client_1
ORACLE_HOME_NAME:OraClient11g_home1
ORACLE_HOME_KEY:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1
ORACLE_SID:
NLS_LANG:AMERICAN_AMERICA.WE8MSWIN1252
SQLPATH:
LOCAL:
Client DLL:C:\app\C39293\product\11.2.0\client_1\oci.dll
TNSNames.ora:
SQLNet.ora:
LDAP.ora:
Login.sql:
GLogin.sql:
In system PATH:No
Home is valid:No
OraClient11g_home1_32bit (11.2.0.3)
ORACLE_HOME:c:\oracle\product\11203_32bit\CLIENT_1
ORACLE_HOME_NAME:OraClient11g_home1_32bit
ORACLE_HOME_KEY:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1_32bit
ORACLE_SID:
NLS_LANG:AMERICAN_AMERICA.WE8MSWIN1252
SQLPATH:c:\oracle\product\11203_32bit\CLIENT_1\dbs
LOCAL:
Client DLL:c:\oracle\product\11203_32bit\CLIENT_1\bin\oci.dll
TNSNames.ora:
SQLNet.ora:
LDAP.ora:
Login.sql:
GLogin.sql:c:\oracle\product\11203_32bit\CLIENT_1\sqlplus\admin\glogin.sql
In system PATH:Yes
Run Code Online (Sandbox Code Playgroud)
Q1: OraClient11g_home1是我的64位家用还是我安装了两个Oracle客户端?
Q2:为什么32位TOAD不使用位置#1中的tns而不是仅使用位置#3中的tns?
问题3:如果我离开位置3的tns文件,dbForge和TOAD都可以工作,但我想知道为什么这样我就能准确地理解如何将tns信息从一台机器移动到另一台机器.
在Oracle的SQL*Plus中,SELECT的结果以表格方式显示.有没有办法以键值方式显示行(如MySQL的\G选项)?
我正在处理的数据库(模式不是由我定义的)有一堆名为eg YN_ENABLED(YN = yes no)的列CHAR(1).因此,当我进行查询时,我会得到一个结果
ID_MYTABLE Y Y Y
------------ - - -
3445 Y N Y
Run Code Online (Sandbox Code Playgroud)
因此,哪些列具有哪些值(没有在另一个窗口中打开架构)并不是很清楚.
是否可以使用与Oracle 10/11捆绑的sqlldr使用完全限定的TNS条目?
例如,在SQLPlus中:
sqlplus user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) @script.sql
Run Code Online (Sandbox Code Playgroud)
但是使用sqlldr(SQL Loader)似乎直接使用TNS条目存在问题.特别:
sqlldr user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'
Run Code Online (Sandbox Code Playgroud)
这是产生的错误消息:
LRM-00116: syntax error at 'address' following '('
SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:41:54 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
SQL*Loader-100: Syntax error on command-line
Run Code Online (Sandbox Code Playgroud)
尝试将TNS条目封装在引号中会产生相同的错误.
看看sqlldr文档,并尝试使用'userid'命令行参数无济于事.特别:
sqlldr userid='user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' bad='bad.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'
LRM-00116: syntax error at 'password@(' following '='
SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:44:17 2011
Copyright (c) 1982, …Run Code Online (Sandbox Code Playgroud) 我有这张桌子
create table student (
stu_id int,
s_name nvarchar(max),
s_subject nvarchar(max),
)
Run Code Online (Sandbox Code Playgroud)
这是数据
insert into student values(123,'pammy','English');
insert into student values(123,'pammy','Maths');
insert into student values(123,'pammy','Chemistry');
insert into student values(124,'watts','Biology');
insert into student values(125,'Tom','Physics');
insert into student values(125,'Tom','Computer';
insert into student values(125,'Tom','ED';
Run Code Online (Sandbox Code Playgroud)
所以我想检索已发生两次以上的记录.我的代码是
select stu_id,s_Name
from student
group by stu_id,s_Name
having count(stu_id) >2 ;
Run Code Online (Sandbox Code Playgroud)
结果很完美.
但是当我想要s_subject它时也没有选择任何行.我不知道为什么.
select stu_id,s_Name,s_subject
from student
group by stu_id,s_Name,s_subject
having count(stu_id) >2 ;
Run Code Online (Sandbox Code Playgroud) 我正面临一个非常烦人的问题.我写了(在Notepad ++中)一些SQL脚本.现在,当我尝试通过SQL*Plus(通过命令行,在Windows 7上)执行它们时,我收到的错误就像ORA-00933: SQL command not properly ended.
然后我将脚本复制并粘贴到SQL Developer工作表窗口,点击Run按钮,脚本执行时没有任何问题/错误.
经过长时间的调查,我开始认为SQL*Plus有一些问题,包括一些它不理解的空格(包括换行符和制表符).
由于我假设SQL Developer知道如何摆脱奇怪的空白,我试过这个:将脚本粘贴到SQL Developer工作表窗口中,然后从那里复制并将其粘贴回SQL脚本中.这解决了一些文件的问题,但不是所有文件.有些文件在没有明显原因的地方继续显示错误.
你有过这个问题吗?我该怎么做才能通过SQL*Plus通过命令行运行这些脚本?
更新:
一个脚本示例,该脚本不能与SQL*Plus一起使用但是与SQL Developer一起使用:
SET ECHO ON;
INSERT INTO MYDB.BOOK_TYPE (
BOOK_TYPE_ID, UNIQUE_NAME, DESCRIPTION, VERSION, IS_ACTIVE, DATE_CREATED, DATE_MODIFIED
)
SELECT MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Book-Type-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Description-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, A.VERSION, B.IS_ACTIVE, SYSDATE, SYSDATE FROM
(SELECT (LEVEL-1)+0 VERSION FROM DUAL CONNECT BY LEVEL<=10) A,
(SELECT (LEVEL-1)+0 IS_ACTIVE FROM DUAL CONNECT BY LEVEL<=2) B
;
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
SQL> SQL> SET ECHO ON;
SQL>
SQL> INSERT INTO MYDB.BOOK_TYPE (
2 …Run Code Online (Sandbox Code Playgroud) 任何人都可以指出我使用正确的语法,以便只有在数据库中当前不存在时才创建表吗?
我正在编程Java GUI以便连接到Oracle并在我的数据库上执行语句,我想知道我是否将其实现为Java约束或SQLPlus约束.
我必须一次运行多个SQL脚本文件.
就像每次我必须在SQLPLUS中编写命令一样
SQL>@d:\a.txt SQL>@d:\a2.txt SQL>@d:\a3.txt SQL>@d:\a4.txt
是否有任何方法将所有文件放在一个文件夹中并一次运行所有脚本文件,而不会丢失任何单个文件,如 @d:\final.txt或@d\final.bat