使用数据库链接访问单个列

时间:2019-01-10 08:30:33

标签: sql-server oracle linked-server database-link

我是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

我想知道为什么在引用单个列而不用双引号引起来时会出现错误。

2 个答案:

答案 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”。