我是Oracle世界的新手。我最近在Oracle中创建了一个数据库链接来从SQL Server提取数据,并且能够提取数据。
function Get-AzureFiles
{
param([string]$filesharename = 'testfolder', #replace with your own fileshare name
[string]$username = 'your account name',
[string]$password = 'your account key',
[string]$destination=$env:TEMP+"\", #note there is a slash at the end
[string]$path="")
$temp = $env:TEMP
# get the context
$context = New-AzureStorageContext -StorageAccountName $username -StorageAccountKey $password
# get all files and directories
if($path -eq "")
{
$content = Get-AzureStorageFile -ShareName $filesharename -Context $context
}
else
{
$content = Get-AzureStorageFile -ShareName $filesharename -Context $context -Path $path | Get-AzureStorageFile
}
if(!(test-path $destination))
{
mkdir $destination
}
foreach($c in $content)
{
$p = $c.uri.LocalPath -replace "$($c.share.name)/" ,''
#write-host "the value p is: $p"
#if it's a directory in fileshare
if($c.gettype().name -eq "CloudFileDirectory")
{
# Write-Host "$($c.share.name) is a directory"
$destination =$temp + $c.uri.PathAndQuery -replace "/","\"
#create the folder locally
if(!(test-path $destination))
{
mkdir $destination
#write-host "the new directory $destination is created locally."
}
#define the folder path in fileshare
$path = ($c.uri.localpath -replace "/$filesharename/" , "") -replace "/","\"
Get-AzureFiles -destination $destination -path $path
}
#if it's a file
elseif($c.gettype().name -eq "CloudFile")
{
$s = $temp + $c.uri.PathAndQuery -replace "/","\"
#Write-Output "downloading --- $s"
$d1 = $c.uri.PathAndQuery -replace "/","\"
$d1 = $d1.remove($d1.LastIndexOf("\")+1)
$destination =$temp + $d1
#create the folder locally
if(!(test-path $destination))
{
mkdir $destination
#write-host "the new directory $destination is created locally."
}
$path_temp = $c.uri.PathAndQuery -replace "/$filesharename/",""
Get-AzureStorageFileContent -ShareName $filesharename -Path $path_temp -Destination $destination -Context $context
}
}
}
function do-test
{
get-AzureFiles
# you can operate the files copied to $env:temp
dir $env:TEMP\testfolder
dir $env:TEMP\testfolder\t1
dir $env:TEMP\testfolder\t1\t1sub
}
do-test
上面的查询从SQL Server上托管的“ emp”表中提取所有行。
但是当我参考如下所示的特定列时,Oracle抛出错误。
SELECT * FROM emp@dblink
错误: ORA-00904:“ EMPID”:无效的标识符
但是当我将empid列用双引号引起来时,它开始起作用。
--This query failed
SELECT empid FROM emp@dblink
我想知道为什么在引用单个列而不用双引号引起来时会出现错误。
答案 0 :(得分:-1)
[TL; DR]最简单的事情是永远不要在对象名周围使用双引号,而让oracle以默认方式管理大小写敏感,如果您要引用区分大小写的数据库中的列通过dblink,然后以大写字母命名这些列,这样您就不必在Oracle中使用双引号。
默认情况下,Oracle数据库区分大小写;但是,默认情况下,它们还会将所有内容都转换为大写形式,以便区分大小写,即用户。
CREATE TABLE emp ( empid NUMBER(12,0) );
然后:
SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;
将全部给出相同的输出,并且:
SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;
输出:
TABLE_NAME COLUMN_NAME
---------- -----------
EMP EMPID
(注意表名是大写)。
如果您使用双引号,则oracle将尊重您在对象标识符中使用大小写:
CREATE TABLE emp ( "empid" NUMBER(12,0) );
然后:
SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;
输出:
TABLE_NAME COLUMN_NAME
---------- -----------
EMP empid
(注意:Oracle尊重empid
列的大小写)。
,您现在只能使用以下内容引用该列:
SELECT "empid" FROM emp;
这些查询将失败:
SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;
由于Oracle会将标识符转换为大写,因此没有EMPID
列,只有empid
列。
要么使用双引号引用该列,要么将该列重命名为EMPID
,以允许您利用Oracle的默认行为,即从用户抽象出区分大小写的字符(但这可能会破坏其他确实使用double的查询。 -引号(非大写的列名)。
答案 1 :(得分:-1)
在Oracle中,数据字典中的列通常不区分大小写,因为:
select empno from EMP
select EMPNO from emp
select EMPNO from Emp
将很高兴地与数据字典中名为EMP的列EMPNO匹配。如果要区分大小写,请使用双引号,例如
select "EmpNo" from EMP
只要EMP表最初是使用以下命令定义的,便可以工作:
create table emp ("EmpNo" int)
等SQL Server是不同的,并且将大小写保留在字典中,因此当我们通过dblink从Oracle查询它时,我们将保留大小写。因此,必须将Oracle中SQL Server中名为MixedCase的列称为“ MixedCase”。