PDA

View Full Version : SQL Select für Dateisysteme (Verzeichnisinhalte)



cicero22
31-03-20, 09:44
Hallo zusammen,

gibt es ab V7R3 ein SQL Select, mit dem ich Verzeichnisinhalte meiner Dateisysteme ausgeben kann?

Danke für Eure Hilfe und bleibt gesund.

VG Dirk

xenofob
31-03-20, 09:59
https://www.itjungle.com/2014/08/27/fhg082714-story02/
https://www.scottklement.com/udtf/ifsDirArticle.html

B.Hauser
31-03-20, 11:27
Schau Dir doch mal die Tabellen-Funktion IFS_Object_Statistics an:

Die folgende Abfrage bringt liest die Verzeichnisstruktur (incl. Sub-Directories) unter '/home/YourDir1/YourDir2) aus.

Select *
from Table(IFS_Object_Statistics('/home/YourDir1/YourDir2')) x

Birgitta

cicero22
02-04-20, 08:41
Hallo xenofob und Birgitta,

Danke für Eure raschen Antworten!

@Birgitta: Was mache ich aber falsch?

Ich sende ab:
Select *
from Tables(IFS_Object_Statistics('/usr/bin/')) x

und erhalte zurück:
Nachrichten-ID . . . . : SQL0104


Nachricht . . . : Token ( ungültig. Gültige Token: FOR USE SKIP WAIT WITH
FETCH LIMIT ORDER UNION EXCEPT OFFSET.

Danke und Gruß, Dirk

Robi
02-04-20, 08:59
Select *
from Table (IFS_Object_Statistics('/usr/bin/')) x

funktioniert, gibt aber nur *pointer als pfad / name zurück

Fuerchau
02-04-20, 10:41
Dies sind LOB-Locaters und können per Locater-Funktionen bearbeitet werden.
https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/odbc/src/tpc/db2z_uselocat.html
Ggf. kann man auch per substring die Locator's auslesen.

B.Hauser
02-04-20, 11:54
Das liegt daran, dass Du mit STRSQL arbeitest und das wurde seit Release 4.5 nicht mehr erweitert!
Verwende ACS (Access Client Solutions) Run SQL Script und schon siehst Du die Werte.

Was die Verarbeitung angeht, so kannst Du bei embedded SQL die Werte auch ganz normal in eine CHAR oder besser VARCHAR Variable übernehmen.

Wenn Du den Inhalt der Dateien benötigst, solltest Du zusätzlich mit GET_CLOB_FROM_FILE oder GET_BLOB_FROM_FILE. Beide bringen einen LOB-Locator zurück. In embedded SQL definierst Du einen LOB-Locator mit SQLTYPE.


DCL-S MyLobLoc SQLTYPE(CLOB_Locator);

Den LOB-Locator kannst Du dann mit SQL-Funktionen (z.B. SUBSTR oder LOCATE) bearbeiten wie eine alphanumische Variable.

Aber Achtung: LOB Locators können nur unter Commitment Control verwendet werden. (COMMIT/ROLLBACK geben den im Untergrund allocierten Pointer frei)

Birgitta

cicero22
02-04-20, 12:01
Wow, Danke Euch zusammen für diese wertvollen Infos.

Bleibt gesund, Gruß Dirk

andreaspr@aon.at
02-04-20, 12:12
Du kannst den pointer auch in ein VARCHAR konvertieren, dann siehst du im STRSQL auch ein Ergebnis.

Fuerchau
02-04-20, 12:31
Aber Achtung:
Bei der Umwandlung in CHAR/VARCHAR darf die max. Satzlänge von 32KB immer noch nicht überschritten werden. Daher mein Hinweis, die Daten ggf. per SUBSTRING zu verkürzen damit der Cast in VARCHAR auch nicht zu Fehlern führt.
U.U. musst du die Daten auch in N[VAR]CHAR casten da sie ggf. Unicode (DBCLOB) enthalten.