「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:1
総数:2267
現在:2


既存Tableに空(Null値)のFieldを追加して新しいTableを作成するSQLについて

ページOpenOffice.org FAQの登録ページ
投稿者New_OOo3
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-02-20 00:48:03 (日)
OSWindows7 Pro 32bit
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

お世話になります。

最近やっとCalcとBaseの利用方法の違いが少し分かったのでBase(HSQL)のSQLを勉強しております。 そこで、既存Table(Table名:ADRESS)に空(Null値)Fieldを追加したTable(Table名:TEST)を新たに作るSQLを以下のSQL1にて試みておりますが、下図Error Messageが表示されます。
(LibreOffice3.3.0 Release版)

****** SQL1 *******
SELECT *, Null as TESTFIED INTO TEST FROM ADRESS
******************
QABaseInto.png

選択だけならば下記SQL2にて行えます。

***** SQL2 ********
SELECT * FROM ADRESS
*******************

つきましては、既存Tableを用いて新たに空(Null値)Fieldを追加したTableを方法をご教示頂けます様お願いします。

蛇足ながらMS-ACCESSの以下のSQL3と同等の事を行いたいと考えております。

***** SQL3 ********
SELECT [ADRESS].*, Null as [TESTFIED] INTO [TEST] FROM [ADRESS]
*******************

宜しくご回答を頂けます様お願いします。


コマンド実行する場所

ike@九州 (2011-02-20 10:51:08 (日))

エラーメッセージより推測すると
コマンド実行する場所をクエリーのSQL表示画面上でされているようです

クエリーはデータ内容を読み込むものですので
New_OOo3 さんの意図するテーブルの新規作成等は
BASE のメニュー
ツール>SQL の実行コマンド画面で行い
表示>テーブルの更新 も必要になります。

OpenOffice.org Basicで同じ事をすると・・・

new_OOo3 (2011-02-20 19:39:49 (日))

ike@九州 様

Baseの基本操作に対して丁寧にご教示頂きましてありがとうございます。
ご教示頂いた方法で上記SQLで新規Tableが作成出来ました。
そこで、同じ事をOpenOffice.org Basicにて行うべく下記Code1にて既存Tableの全Fieldを抽出して新しいTableを作成する事ができました。

********[ Code1 ]**********
Sub oSQL
	'Create New Base Document 
		Dim oDoc
		Dim Dummy()
		Dim oAns
			oDoc = StarDesktop.loadComponentFromURL("private:factory/sdatabase", "_blank", 0, Dummy())
			oDataSource = oDoc.DataSource
		'
		' set to use hsqldb
			oDataSource.URL = "sdbc:embedded:hsqldb"
			oTempName = ConvertToUrl("c:\temp\oBaseMacroTest.odb")
			oDoc.StoreAsURL(oTempName,Dummy())			
		'
		' Load the Tools library
				If NOT GlobalScope.BasicLibraries.isLibraryLoaded("Tools") Then
					GlobalScope.BasicLibraries.LoadLibrary("Tools")
				End If		
		'
		' Connect DB
			Dim oBaseContent
			Dim oDB
			Dim oCon	
				oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
 				oDB = oBaseContext.getByName(oTempName)
 				oCon = oDB.getConnection("", "")
 			' CREATE TABLE句
 			Dim oStmt
 			Dim oSQL as String
 			Dim oTableName as String
 				oTableName = "ADRESS"			' 大文字
 				oStmt = oCon.createStatement()
				oSQL = "CREATE TABLE " & oTableName & "(ID INTEGER IDENTITY,ADRESS varchar(20),TITLE varchar(20),NAME varchar(30), PRIMARY KEY (ID)) "
				oStmt.execute(oSQL)
 			'
 			' INSERT INTO句
 			Dim oSQL2 as String
 			Dim oValue as String
 			Dim i as Integer
 				for i = 1 to 100
 					oValue = "VALUES(" & i & ",'home" & i & "', 'Test" & i & "', 'New_OOo3" & "_" & i & "')"
 					oSQL2 = "INSERT INTO " & oTableName & "(ID, ADRESS, TITLE, NAME)" & " " & oValue
 					oStmt.executeUpdate(oSQL2)
 				Next i
 			' WHERE句
 			Dim oWhere as String
 				oWhere = " WHERE ( (" & oTableName & ".ADRESS Like 'home%' AND " & oTableName & ".NAME Like '%OOo3_%' ))"
 			' SELECT句
 			Dim oSQL3 as String
 			Dim oTableName2 as String
 				oTableName2 = "SELECT_ADRESS"
 				oSQL3 = "SELECT * INTO " & oTableName2 & " FROM " & oTableName & oWhere
 				oStmt.execute(oSQL3)
 			'
 			oCon.Close()
 			oCon.dispose
 		'
 		' Display
 		msgbox "Success"
End Sub
****************************************


しかしながら、

oSQL3 = "SELECT * INTO " & oTableName2 & " FROM " & oTableName & oWhere
=>
oSQL3 = "SELECT *, Null as TESTFIELD INTO " & oTableName2 & " FROM " & oTableName & oWhere


にすると以下のMacro自体は最後まで処理されるのですが、作成された新規DatabaseのMenuでTableを選択すると以下のError Messageが表示されます。

QABaseMacro.png


つきましては、被せ質問で申し訳ございませんが、対処方法や考えられる原因等をご教示頂けます様お願いします。

テーブルの更新

M.Kamataki (2011-02-20 21:30:35 (日))

「ツール」−「SQL」からSQLを実行した際は、テーブルが作成され、テーブルにアクセスできたんですよね。

GUIから操作した場合と異なりマクロでテーブルを作成した場合は、作成したテーブルにアクセスする前に「テーブルの更新」をしないといけません。メニューからは、「表示」−「テーブルの更新」を実行します。更新を行うとテーブルにアクセスできるようになるはずです。どうでしょうか。

このマクロでテーブルを作成した場合の動作については、以下のドキュメントの「2.2.4. Refresh the tables」で触れられています。

http://www.pitonyak.org/database/AndrewBase.pdf

ただし、掲載されているマクロ例ではうまく「テーブルの更新」ができなかった記憶があります。というわけで、当Q&Aでは、

oDisp.executeDispatch(oFrame,".uno:DBRefreshTables", "", 0, Array())


oDisp.executeDispatch(oFrame,".uno:DBViewTables", "", 0, Array())
oDisp.executeDispatch(oFrame,".uno:DBRefreshTables", "", 0, Array())

と修正して紹介しています。faq/4/74「Querie.Command 後に更新できない!」やfaq/5/172「クエリで並べ替えた後行番号を表示するには」も参考に。

Tableの更新を追加しましたが、結果は同じです。

new_OOo3 (2011-02-20 22:48:19 (日))

M.Kamataki

ご回答を頂きましてありがとうございます。

「ツール」=>「SQL」からSQLを実行した時は問題無くTable作成できました。
確認手順は下記Code2にて「ADRESS」Tableを作成し、そのDataを用いて「SQLステートメントの実行」WindowにてSQLを実行しました。

************ [ Code2 ] ****************
Sub oSQL
	[ 中略 ](ここまでは上記Code1と同じです。)
	' CREATE TABLE句
	Dim oStmt
	Dim oSQL as String
	Dim oTableName as String
	    oTableName = "ADRESS"			' 大文字
	    oStmt = oCon.createStatement()
	    oSQL = "CREATE TABLE " & oTableName & "(ID INTEGER IDENTITY,ADRESS varchar(20),TITLE varchar(20),NAME varchar(30), PRIMARY KEY (ID)) "
	    oStmt.execute(oSQL)
	   '
	   ' INSERT INTO句
	   Dim oSQL2 as String
	   Dim oValue as String
	   Dim i as Integer
	       for i = 1 to 100
	          oValue = "VALUES(" & i & ",'home" & i & "', 'Test" & i & "', 'New_OOo3" & "_" & i & "')"
		  oSQL2 = "INSERT INTO " & oTableName & "(ID, ADRESS, TITLE, NAME)" & " " & oValue
		  oStmt.executeUpdate(oSQL2)
	       Next i
	  '
	  oCon.Close()
	  oCon.dispose
	  '
	  ' Display
	  msgbox "Success"
End Sub
**************************************

Code2にて作成したBase Document(oBaseMacroTest.odb)とTable(ADRESS)

QABaseMacroTable1.png
QABaseMacroTable1_1.png


「SQLステートメントの実行」Window

QABaseSQLState.png


「SQLステートメントの実行」にてSQLを実行した後のDocumentとTable

QABaseMacroTable2.png
QABaseMacroTable3.png


しかし、ご教示頂きましたQ&Aを参照して「Tableの更新」を追加した下記Code3を追加しましたが、同じ現象です。
また、macro処理実行後に手作業で「表示」=>「テーブルの更新」を実施を行うにも、「テーブル(A)」を選択した途端に上記Error Messageが表示されます。

***********[ Code3 ]**************
Sub oSQL
   [ 中略 ](ここまでは上記Code2と同じです。)
   ' WHERE句
   Dim oWhere as String
       oWhere = " WHERE ( (" & oTableName & ".ADRESS Like 'home%' AND " & oTableName & ".NAME Like '%OOo3_%' ))"
       ' SELECT句
	Dim oSQL3 as String
	Dim oTableName2 as String
	    oTableName2 = "SELECT_ADRESS"
	    oSQL3 = "SELECT *, Null as TESTFIELD INTO " & oTableName2 & " FROM " & oTableName & oWhere
	    oStmt.execute(oSQL3)
	    '
	    oCon.Close()
	    '
	    TableRefresh(oDoc.getURL) 'テーブル更新(Base による接続確立)
	    wait 100
	 '  oCon.dispose
	    '
	' Display
	    msgbox "Success"
End Sub~
'~
Sub TableRefresh(sURL)~
	oComponents = StarDesktop.Components
	oComponentsEnum = oComponents.createEnumeration()
  	While oComponentsEnum.hasMoreElements()
   	oComponent = oComponentsEnum.nextElement()
   	If HasUnoInterfaces(oComponent, "com.sun.star.frame.XModel") then
   		If oComponent.getURL = sURL then
       		oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	     		oFrame = oComponent.getCurrentController().getFrame()
       		oDispatch.executeDispatch(oFrame,".uno:DBViewTables", "", 0, Array())
       		oDispatch.executeDispatch(oFrame,".uno:DBRefreshTables", "", 0, Array())           
     		End if
   	End if   
  	Wend
End Sub
********************************************

「テーブルの更新」のCodeの有無に関わらず、 oSQL3中の「, Null as TESTFIELD」さえ無くせばError Messageは表示されません。
蛇足ながら下記環境でも同じ現象です。
WindowsXP Pro SP3 / OpenOffice.org3.3.0[Release版]
宜しくお知恵を拝借させて頂けます様お願いします。

検証

ike@九州 (2011-02-21 10:13:13 (月))

SELECT *, Null as TESTFILED INTO TEST FROM ADRESS;
コマンド実行後、テーブルは正常表示。

保存後、一度閉じてBASEドキュメントを開くと、同じエラーメッセージで壊れた状態になっていました。

作成されたテーブルは TESTFILED の列定義が作成されていませんでした。
修復する為には odb ファイルを ZIP 解凍後、database フォルダ内 script ファイルをエディタで開き
TESTFIELD VARCHAR を TESTFIELD VARCHAR(50) に変更して、odb を再構築することで修復できました。

上記内容から HSQLDB では SQL を

SELECT * INTO TEST FROM ADDRESS;
ALTER TABLE TEST ADD TESTFIELD VARCHAR(50);

とした方が良いような気がします。

出来ました。

new_OOo3 (2011-02-21 18:04:51 (月))

ike@九州 様

ご教示ありがとうございます。
ご指摘の通り、以下の様にSQLを追加したところ、上手く出来ました。(oSQL3 => oSQL3,oSQL4)

****** [ SQLの変更 ] *******
oSQL3 = "SELECT *, Null as TESTFIELD INTO " & oTableName2 & " FROM " & oTableName & oWhere
oStmt.execute(oSQL3)
=>
oSQL3 = "SELECT INTO " & oTableName2 & " FROM " & oTableName & oWhere
oStmt.execute(oSQL3)
oSQL4="ALTER TABLE " & oTableName2 & " ADD TESTFIELD VARCHAR(50)"
oStmt.execute(oSQL4)
****************************


ike@九州 様、M.Kamataki
今回は、「SQLステートメントの実行」WindowでのSQLの実行等の多くの事についてご教示頂きましてありがとうございます。
恥ずかしながら、今年2月から某○S-○CCESSで約500,000 Recordの複数のTable操作を行ってやっと表計算ApplicationとDataBase Applicationの利用方法の違いが分かり、現在SQLを勉強しています。
本質問もBaseの問題なのかHSQLDBの問題なのかさえ分らずに質問したにも関わらず丁寧なご回答を頂きまして本当にありがとうございました。
また、当方の上記投稿につきまして、余りにCodeを羅列して汚らしいので、修正させて頂きました。

お名前:
題名:


添付ファイル: fileQABaseMacroTable1_1.png 633件 [詳細] fileQABaseMacroTable3.png 659件 [詳細] fileQABaseMacroTable2.png 634件 [詳細] fileQABaseSQLState.png 617件 [詳細] fileQABaseMacroTable1.png 638件 [詳細] fileQABaseMacro.png 606件 [詳細] fileQABaseInto.png 617件 [詳細]